在 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 中有多种用途,包括类型约束、类型推断和类继承。它使得我们可以对类型进行更精确的约束和操作,以及实现面向对象的继承关系。