返回

TypeScript中的 extends 和 infer:深入理解和应用

前端

extends

extends 是 TypeScript 中用于类型扩展的。它允许我们从一个类型派生出另一个类型,并继承前者的成员和特性。

class Animal {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  speak() {
    console.log(`My name is ${this.name} and I am ${this.age} years old.`);
  }
}

class Dog extends Animal {
  breed: string;

  constructor(name: string, age: number, breed: string) {
    super(name, age);
    this.breed = breed;
  }

  bark() {
    console.log(`Woof! Woof! I am ${this.name} the ${this.breed}.`);
  }
}

const dog = new Dog('Buddy', 3, 'Golden Retriever');
dog.speak(); // My name is Buddy and I am 3 years old.
dog.bark(); // Woof! Woof! I am Buddy the Golden Retriever.

在上面的示例中,我们定义了一个 Animal 类,它具有 name 和 age 两个属性和一个 speak() 方法。我们还定义了一个 Dog 类,它从 Animal 类继承,并添加了 breed 属性和一个 bark() 方法。

通过使用 extends,我们可以轻松地创建新的类型,并复用现有类型的特性。这使得 TypeScript 成为构建大型、复杂应用程序的理想选择。

infer

infer 是 TypeScript 中用于类型推断的关键字。它允许我们从一个类型中推断出另一个类型。

type T extends {} = {};

type TKeys = keyof T; // 推断出 T 的键类型

type TValues = T[keyof T]; // 推断出 T 的值类型

在上面的示例中,我们定义了一个 T 类型,它可以是任何对象类型。我们使用 infer 推断出 T 的键类型和值类型。

infer 还可以用于更复杂的类型推断场景。例如,我们可以使用它来推断泛型函数的参数类型和返回值类型。

function map<T, U>(array: T[], callback: (item: T) => U): U[] {
  return array.map(callback);
}

const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = map(numbers, (n) => n * 2); // 推断出 doubledNumbers 的类型为 number[]

在上面的示例中,我们定义了一个 map 函数,它接收一个数组和一个回调函数,并返回一个新数组。回调函数接收数组中的每个元素,并返回一个新值。我们使用 infer 推断出回调函数的参数类型和返回值类型。

infer 是一个非常强大的类型推断工具,它可以帮助我们编写出更简洁、更易维护的 TypeScript 代码。

结语

extends 和 infer 是 TypeScript 中非常重要的两个类型系统特性。它们允许我们对类型进行高级的操作和推断,从而编写出更加健壮、更加可维护的代码。如果您想成为一名优秀的 TypeScript 开发人员,那么您就必须熟练掌握这两个特性。