跳到主要内容

泛型

泛型

泛型表示通用的类型,可以代表任意类型,也叫做类型参数.

比如有这么一个函数:

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 的运算.

参考