返回
TypeScript 条件类型的 infer 类型推断能力是怎样的?
前端
2023-09-14 15:51:03
TypeScript 条件类型的 infer 类型推断能力
类型推断 infer 是作为 extends 条件类型的子语句使用,同时在 TS2.8 推出。(如果你不熟悉 extends 条件类型可以查看之前分享的 TypeScript 的 extends 条件类型)上面的 infer U 语句就是声明一个类型变量 U(它可以是任意字母,比如 T、K 等),类型变量 U 的类型由类型推断 infer U 决定,infer U 会推断出 T extends U 的类型,即 T 的类型。
上面的例子中,我们定义了一个函数 getLength,这个函数接收一个参数 T,T 是一个 extends string 的类型,这意味着 T 必须是一个字符串类型。函数 getLength 返回 T 的长度。
在这个例子中,我们使用 infer U 来推断 T 的类型。infer U 会推断出 T extends string 的类型,即 T 的类型是 string。因此,函数 getLength 的返回值类型是 number。
类型推断 infer 可以让我们推断出复杂类型的类型,使我们可以在更广阔的场景中使用 TypeScript。
infer 的使用
infer 可以用于各种场景,下面是一些常见的用法:
- 推断数组元素的类型
- 推断函数参数的类型
- 推断函数返回值的类型
- 推断对象的属性类型
- 推断类的成员变量的类型
下面是一些使用 infer 的示例:
// 推断数组元素的类型
const numbers: Array<number> = [1, 2, 3];
const firstNumber = numbers[0]; // number
// 推断函数参数的类型
function add(a: number, b: number): number {
return a + b;
}
const result = add(1, 2); // number
// 推断函数返回值的类型
function getLength(s: string): number {
return s.length;
}
const length = getLength("hello"); // number
// 推断对象的属性类型
const person = {
name: "John",
age: 30
};
const name = person.name; // string
// 推断类的成员变量的类型
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
const p = new Person("John", 30);
const pName = p.name; // string
总结
类型推断 infer 是 TypeScript 中一个非常强大的特性,它可以让我们推断出复杂类型的类型,使我们可以在更广阔的场景中使用 TypeScript。
在本文中,我们介绍了 TypeScript 条件类型的 infer 类型推断能力,并通过一些示例来说明 infer 的使用。希望本文对你有帮助。