返回

TypeScript 条件类型的 infer 类型推断能力是怎样的?

前端

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 的使用。希望本文对你有帮助。