跳到主要内容

泛型接口与泛型类

如何用泛型接口描述函数形状?​

interface CreateArrayFunc {
<T>(length: number, value: T): Array<T>;
}

const createArray: CreateArrayFunc = <T>(length: number, value: T): Array<T> => {
const result: T[] = [];
for (let i = 0; i < length; i++) {
result[i] = value;
}
return result;
};
  • 形式: 类型参数写在接口的调用签名中, 每个实现该接口的函数都可独立确定 T;
  • 用途: 给函数变量命名类型, 或约束回调的签名;

泛型类如何使用类型参数?​

class GenericNumber<T> {
zeroValue!: T;
add!: (x: T, y: T) => T;
}

const myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function (x, y) {
return x + y;
};
  • 绑定时机: 类型参数在 new 时确定, 之后类内所有成员都按该类型检查;
  • 作用范围: 只管实例成员, 静态成员不能引用类的类型参数;
  • 说明: ! 是确定赋值断言; 开启严格属性初始化检查时, 也可改为在构造函数中赋值;