无法创建泛型枚举和泛型命名空间
泛型变量T
- 相当与一个形参变量,只是它返回的是值的类型,传什么类型就返回什么类型,保证传入的值和返回的类型相同
1
2
3
4function test<T>(arg: T): T {
return arg
}
let a = test<string>('arg')
泛型函数
调用签名的对象字面量来定义泛型函数
1 | let mytest: {<T>(arg: T): T} = identity |
泛型接口
1 | interface fnType{ |
泛型类 ClassName: 指的是实例部分的类型,类的静态属性不能使用
1 | class GenericNumber<T> { |
泛型约束
- 操作某类型的值时,发现某类型具有T类型,但在调用某个属性时,编译器不能保证T中具有该属性就会报错。所以要继承一个任意类的包含的属性,这样在任意类型中就可以使用且不报错
1
2
3
4
5
6
7
8interface Lengthwise { // 1.将这个属性放在接口中
length : number
}
function check<T extends Lengthwise>(arg: T) : T{ // 2.让T继承这个接口
console.log(arg.length)
return arg
}
check({length: 10}) // 3.使用,一定要传入length里的必须属性
在泛型约束中使用类型参数:通过调用属性名从对象上获取属性,同时保证这个属性就在这个对象上
1 | function getProperty(obj: T, key: K){ |
在泛型里使用类类型: 使用泛型创建工厂函数时,需要引用构造函数的类类型
- 调用的函数可以调用继承父类的方法
- 使用场景: 多个类继承一个父类
- 定义:定义几个类和一个父类,然后创建多个子类继承父类,并且子类中将某个子类赋值给变量(这个变量要统一),这样就可以使用多个子类、某个类和父类的方法和变量
- 使用:
createInstance(子类).父类方法.子类方法 1
2
3function createInstance<T extends 父类>(c: new() =>T): T {
return new c();
}