【10】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-泛型基础全解(泛型函数、泛型接口、泛型类)及参数、接口补充

序言:

本文详细讲解了关于ArkTs语言中的泛型,其中包含泛型函数、泛型接口、泛型约束、泛型类及其中参数的使用方法,补充了一部分接口相关的知识,包括接口的继承和具体实现,也写到了一些边边角角的小知识,剩余参数和展开运算符,便于我们在实际代码编写中让自己的代码更加简洁,可读性更强。

笔者也是跟着B站黑马的课程一步步学习,学习的过程中添加部分自己的想法整理为笔记分享出来,如有代码错误或笔误,欢迎指正。

B站黑马的课程链接:鸿蒙课程介绍_哔哩哔哩_bilibili

往期笔记:

【01】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-ArkTs基础语法与界面开发基础

【02】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-界面进阶与布局排布(附QQ登陆、得物、京东登陆综合案例+代码)

【03】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-更多布局(弹性/层叠)方式与界面开发综合(附飞狗卡片+B站卡片案例+实战开发支付宝界面+代码)

【04】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-ArkTs进阶运算符+状态管理(附综合案例美团购物车)

【05】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-条件渲染+if/switch判断与for/while循环(附计数器、京东加购案例)
【06】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-综合案例·生肖抽奖卡具体实现(类似支付宝集五福)
【07】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Swiper轮播组件与样式&结构重用

【08】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Scroll容器与Tabs组件
【09】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Class类基础全解(属性、方法、继承复用、判断)

目录

一.剩余参数和展开运算符

1.剩余参数

2.展开运算符

二.接口补充

1.接口补充-接口继承

2.接口补充-接口实现

三.泛型

1.泛型函数

2.泛型约束

3.多个泛型参数

4.泛型接口

5.泛型类


一.剩余参数和展开运算符

1.剩余参数

1)简介:

剩余参数的语法,我们可以将函数或方法中一个不定数量的参数表示为一个数组。

2)语法及基础代码实例:

①语法:

复制代码
//剩余参数只能写在最后一位
function 函数名(参数1,参数2,...剩余参数数组){
  //逻辑代码
  //之前的参数:挨个获取即可
  //剩余参数:以数组的形式获取
}

②基础代码实例:

复制代码
function sum(numA:number,numB:number,...theArgs:number[]){
  let total=numA+numB;
  for(const arg of theArgs){
    total+=arg;
  }
  return total;
}
console.log(sum(1,2,3).toString())
console.log(sum(1,2,3,4).toString())

2.展开运算符

1)简介:

处于程序稳定性,以及运行性能考虑,在ArkTs中 ...(展开运算符)只能用在数组上

2)语法及基础代码实例:

复制代码
const numArr1:number[]=[1,2,3,4]
const numArr2:number[]=[5,6,7]
//合并到一起
const totalArr:number[]=[...numArr1,...numArr2]
console.log(totalArr.toString())

二.接口补充

1.接口补充-接口继承

1)简介:

接口继承使用的关键字是extends。

2)语法及基础代码实例:

①语法

复制代码
interface 接口1{
  属性1:类型
}
interface 接口2 extends 接口1{
  属性2:类型
}

②基础代码实例

复制代码
interface IAnimal{
  name:string
}
interface ICat extends IAnimal{
  color:string
}
const cat:ICat ={
  name:'布偶猫',
  color:'白色'
}

2.接口补充-接口实现

1)简介:

可以通过接口结合implements来限制类必须要有某些属性和方法

2)语法及基础代码实例:

①语法

复制代码
interface 接口{
  属性:类型
  方法:方法类型
}


class 类 implements 接口{
  //必须实现 接口中定义的属性、方法,
  //否则会报错
}

②基础代码实例

复制代码
interface IDog{
  name:string
  bark:()=>void
}


class Dog implements IDog{
  name:string
  food:string


  constructor(name:string,food:string) {
    this.name=name
    this.food=food
  }
  bark(){
    console.log(`${this.name}一边吃${this.food}一边大叫`)
  }
}


let d1:Dog=new Dog('河马小狗','达犀牛')
d1.bark()

三.泛型

简介:

泛型可以让**【函数】** 等,与多种**【不同的类型】**一起工作,灵活可复用

通俗一点说就是:类型是可变

1.泛型函数

1)语法

复制代码
//原函数
function fn1(temp:string):string{
  return temp
}
function fn2(temp:number):number{
  return temp
}
function fn3(temp:boolean):boolean{
  return temp
}
//使用泛型后
function fn<Type>(temp:Type):Type{
  return temp
}


fn<string>('1,2,3')
fn<number>(1)

tips:

ArkTs会根据默认传参,进行类型腿短,动态的配置Type类型参数的值。

但是大家能写全尽量写全,这样会提高代码的可读性。

复制代码
fn(true)
fn([1,2,3,4,5])

2)基础代码实例1

①练习需求

定义函数,参数是数组(存的类型不定),返回数组长度

②具体代码

复制代码
function getLength<T>(arr:T[]):number{
  return arr.length
}
console.log('',getLength<number>([1,2,3,4,5]))
console.log('',getLength<string>(['河马','荷花','大炮']))

3)基础代码实例2

①练习需求

定义函数,参数是数组(存的类型不定),返回数组的最后一项。

②具体代码

复制代码
function getLate<T>(arr:T[]):T{
  return arr[arr.length-1]
}
console.log('',getLate([1,2,3,4,5,6,7]))

2.泛型约束

1)简介:

之前的类型参数,可以传递任何类型,没有限制。

如果希望有限制→泛型约束

复制代码
interface 接口{
  属性:类型
}
function 函数<Type extends 接口>(){}

2)基础代码实例

复制代码
interface ILength{
  length:number
}
function fn<T extends ILength>(param:T){
  console.log('',param.length)
}
fn<string>('hahahaha')
fn<boolean>(true) //会报错
复制代码
interface ILength{
  length:number
}
function fn<T extends ILength>(param:T){
  console.log('',param.length)
}
fn<string>('hahahaha')
/*fn<boolean>(true)*/
class Desk{
  length=2
}
let d1=new Desk()
fn<Desk>(d1)

3.多个泛型参数

1)简介:

日常开发的时候,如果有需要,可以添加多个 类型变量

2)基础代码实例

复制代码
function  funcA<T,T2>(param1:T,param2:T2){
  console.log('参数1',param1)
  console.log('参数2',param2)
}
funcA<string,number>('河马',888)
funcA<string[],boolean[]>(['荷花'],[false])

4.泛型接口

1)简介:

定义接口的时候,结合泛型定义,就是泛型接口。

复制代码
interface 接口<Type>{
  //内部使用Type
}

2)基础代码实例

复制代码
interface IdFunc<Type>{
  //约定有两个方法(id类型不定,可能是string可能是number)
  //1.传入id值,就返回id值。
  //2.返回一个ids数组
  id:(value:Type)=>Type
  ids:()=>Type[]
}


let obj1:IdFunc<number>={
  id(value){
    return value
  },
  ids(){
    return[1,2,3,4,5]
  }
}


let obj2:IdFunc<string>={
  id(value){
    return value
  },
  ids(){
    return['001','002','003']
  }
}

5.泛型类

1)简介:

定义类的时候,结合泛型定义,就是泛型类。

复制代码
class 类名<Type>{
  //内部可以使用Type
}

2)基础代码实例

复制代码
//泛型类:定义类的时候,配合泛型一起定义
class Person<T>{
  id:T


  constructor(id:T) {
    this.id=id
  }
  getId(){
    return this.id
  }
}
let p1:Person<string> = new Person('河马')
let p2:Person<number> = new Person(123456789)
console.log(p1.getId())
console.log(p2.getId().toString())

感谢观看。

相关推荐
blackA_3 小时前
数据库MySQL学习——day4(更多查询操作与更新数据)
数据库·学习·mysql
梁下轻语的秋缘5 小时前
每日c/c++题 备战蓝桥杯(P1049 [NOIP 2001 普及组] 装箱问题)
c语言·c++·学习·蓝桥杯
刘婉晴5 小时前
【信息安全工程师备考笔记】第三章 密码学基本理论
笔记·安全·密码学
球求了5 小时前
C++:继承机制详解
开发语言·c++·学习
时光追逐者6 小时前
MongoDB从入门到实战之MongoDB快速入门(附带学习路线图)
数据库·学习·mongodb
一弓虽6 小时前
SpringBoot 学习
java·spring boot·后端·学习
晓数7 小时前
【硬核干货】JetBrains AI Assistant 干货笔记
人工智能·笔记·jetbrains·ai assistant
我的golang之路果然有问题8 小时前
速成GO访问sql,个人笔记
经验分享·笔记·后端·sql·golang·go·database
genggeng不会代码8 小时前
用于协同显著目标检测的小组协作学习 2021 GCoNet(总结)
学习
lwewan8 小时前
26考研——存储系统(3)
c语言·笔记·考研