操作符extends的作用是什么?
在 TypeScript 中,extends 操作符有多个作用和用途。
-
类型约束:
extends用于约束泛型类型参数,限制其必须是某个类型的子类型。例如,T extends SomeType表示T必须是SomeType或其子类型。 -
类型推断:
extends用于从条件类型中推断出新的类型。通过使用infer关键字,我们可以在条件类型中引入新的类型变量,并使用extends来对其进行推断。 -
类继承:
extends用于表示一个类继承自另一个类。通过继承,子类可以获得父类的属性和方法,并可以进行扩展或重写。
以下是一些示例来说明 extends 的不同用途:
- 类型约束示例:
function printName<T extends { name: string }>(obj: T) {console.log(obj.name); }printName({ name: "Alice", age: 30 }); // 正确,传入的对象满足约束 printName({ age: 30 }); // 错误,缺少 name 属性在这个示例中,
T extends { name: string }表示泛型类型参数T必须满足约束,即必须具有name属性且类型为string。 - 类型推断示例:
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;function sum(a: number, b: number): number {return a + b; }type Result = ReturnType<typeof sum>; // number在这个示例中,
T extends (...args: any[]) => infer R表示如果T是一个函数类型,那么将其返回值类型推断为R类型。 - 类继承示例:
class Animal {name: string;constructor(name: string) {this.name = name;}speak() {console.log("The animal makes a sound");} }class Dog extends Animal {breed: string;constructor(name: string, breed: string) {super(name);this.breed = breed;}speak() {console.log("The dog barks");} }const dog = new Dog("Buddy", "Labrador"); console.log(dog.name); // Buddy dog.speak(); // The dog barks在这个示例中,
Dog类继承自Animal类,通过extends关键字建立了类之间的继承关系。子类Dog继承了父类Animal的属性和方法,并可以进行扩展或重写。总之,
extends操作符在 TypeScript 中有多种用途,包括类型约束、类型推断和类继承。它使得我们可以对类型进行更精确的约束和操作,以及实现面向对象的继承关系。