TypeScript 泛型
一、泛型函数/方法
typescript
// 定义
funName<T>(arg:T):T {
return arg;
}
// 调用
aboutToAppear(): void {
this.funName<string>('aaa')
}
二、泛型接口
typescript
interface Comparator<T> {
age:T
compareTo(value:T): number;
}
三、泛型类
typescript
class MyMap<K, V> {
key: K;
value: V;
constructor(key: K, value: V) {
this.key = key;
this.value = value;
}
}
鸿蒙需要给key,value初始化的。
也可以改为可选参数形式,就不用初始化了。
typescript
class MyMap<K, V> {
key?: K;
value?: V;
}
四、泛型的类型别名
typescript
type Box<T> = {
content: T;
isEmpty: boolean;
};
// 使用示例
const stringBox: Box<string> = {
content: "Hello World",
isEmpty: false
};
但鸿蒙api12后就不能这样定义了。api12后每个对象都要有具体类型
只好修改为接口的泛型
typescript
interface Box<T> {
content: T;
isEmpty: boolean;
}
// 使用示例
const stringBox: Box<string> = {
content: "Hello World",
isEmpty: false
};
五、泛型的默认类型
typescript
function getFirst<T = string>(
arr:T[]
):T {
return arr[0];
}
调用时可不指定类型,不指定就用string类型
六、泛型的约束
typescript
// 约束接口 - 必须有 length 属性
interface Lengthwise {
length: number;
}
// 泛型约束 - T 必须实现 Lengthwise 接口
function getLength<T extends Lengthwise>(arg: T): number {
return arg.length;
}
// 使用示例
console.log(getLength("Hello")); // 5
console.log(getLength([1, 2, 3, 4, 5])); // 5
console.log(getLength({ length: 10, name: "test" })); // 10
// console.log(getLength(123)); // 错误:number 没有 length 属性