泛型
泛型
泛型表示通用的类型,可以代表任意类型,也叫做类型参数.
比如有这么一个函数:
function identity(arg: number): number {
return arg
}
function identity(arg: string): string {
return arg
}
它的参数和返回值都是同一类型,所以我们可以使用类型参数来表示:
function identity<T>(arg: T): T {
return arg
}
声明时把会变化的类型声明成泛型(也就是类型参数),在调用的时候再确定类型。
let output = identity<string>('myString')
let output = identity('myString')
我们可以显示的设置参数的类型,也可以不设置,编译器会自动推断类型.但当编译器推断类型失败时,就需要显示的设置类型.
类型编程(类型体操)
对传入的类型参数(泛型)做各种逻辑运算,产生新的类型,这就是类型编程。
function getProperty<Type, Key extends keyof Type>(obj: Type, key: Key) {
return obj[key]
}
let x = { a: 1, b: 2, c: 3, d: 4 };
getProperty(x, "a");
getProperty(x, "m");
Argument of type '"m"' is not assignable to parameter of type '"a" | "b" | "c" | "d"'.
这里的Key extends keyof Type,表示 Key 必须是 Type 的一个属性。keyof Type
就是 对类型 Type 的运算.