泛型
-
介绍
可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据
// 返回值的类型与传入参数的类型相同 function identity<T>(arg: T):T{ return arg }
-
使用泛型变量
使用泛型创建像
identity
这样的泛型时,编辑器要求在函数体必须正确的使用这个通用的类型。也就是说,必须把这个参数当做是任意或者所有类型// 不确定arg的类型,是不是有Length属性 function identity<T>(arg: T):T { console.log(arg.length) // error } // 更改 function identity<T>(arg: T[]):T[] { console.log(arg.length) // success }
-
泛型类型
泛型函数的类型与非泛型函数的类型没有什么不同,只是有一个类型参数在最前面,像函数声明一样
function identity<T>(arg: T):T { return arg } let myIdentity = <T>(arg: T) => T = identity;
也可以使用不同的泛型参数名,只要在数量上和使用方式上能对应上就可以
function identity<T>(arg: T):T { return arg } let myIdentity = <U>(arg: U) => U = indentity
还可以使用带有调用签名的对象字面量来定义泛型函数
function identity<T>(arg: T):T { return arg } let myIdentity: {<T>(arg: T): T} = identity
泛型接口
interface Config { <T>(arg: T): T } function indetity<T>(arg: T):T { return arg } let myIdentity: Config = identity
-
泛型类
泛型类使用(
<>
)括起来泛型类型,跟在类名后面// 泛型类指的是实例部分的类型,所以类的静态属性不能使用这个泛型约束 class Demo<T> { name: T handle: (x: T, y: T) => T }
-
泛型约束
定义一个接口描述约束条件
// 使用config接口和extends实现约束 interface config { length: number } function indentity<T extends config>(arg: T): T { console.log(arg.length) }
在泛型中使用类型参数
// 声明一个类型参数,且被另一个类型参数所约束 function select(obj: T, key: K) { return obj[key] } let x = {a: 1, b: 2, c: 2} select(x, 'a') // success select(x, 'm') // error
在泛型里使用类类型
// 在typescript使用泛型创建工厂函数时,需要引用构造函数的类类型 function create<T>(c: {new(): T}): T { return new c() }