TypeScript 中的 extends 关键字就像一把瑞士军刀。它用于多种上下文,包括继承、泛型和条件类型。了解如何有效地使用扩展可以生成更健壮、可重用和类型安全的代码。
extends 的主要用途之一是继承,允许您创建基于现有接口或类的新接口或类。
interface User { firstName: string; lastName: string; email: string; } interface StaffUser extends User { roles: string[]; department: string; } const regularUser: User = { firstName: "John", lastName: "Doe", email: "[email protected]" }; const staffMember: StaffUser = { firstName: "Jane", lastName: "Smith", email: "[email protected]", roles: ["Manager", "Developer"], department: "Engineering" };
在此示例中,StaffUser 扩展了 User,继承了其所有属性并添加了新属性。这使我们能够基于更通用的类型创建更具体的类型。
extends关键字也用于类继承:
class Animal { constructor(public name: string) {} makeSound(): void { console.log("Some generic animal sound"); } } class Dog extends Animal { constructor(name: string, public breed: string) { super(name); } makeSound(): void { console.log("Woof! Woof!"); } fetch(): void { console.log(`${this.name} is fetching the ball!`); } } const myDog = new Dog("Buddy", "Golden Retriever"); myDog.makeSound(); // Output: Woof! Woof! myDog.fetch(); // Output: Buddy is fetching the ball!
这里,Dog 扩展了 Animal,继承了它的属性和方法,同时还添加了它自己的属性和方法。
extends 关键字在使用泛型时至关重要,它允许我们限制可与泛型函数或类一起使用的类型。
interface Printable { print(): void; } function printObject(obj: T) { obj.print(); } class Book implements Printable { print() { console.log("Printing a book."); } } class Magazine implements Printable { print() { console.log("Printing a magazine."); } } const myBook = new Book(); const myMagazine = new Magazine(); printObject(myBook); // Output: Printing a book. printObject(myMagazine); // Output: Printing a magazine. // printObject(42); // Error, number doesn't have a 'print' method
总之,函数 printObject
T extends U ? X : Y
type ExtractNumber= T extends number ? T : never; type NumberOrNever = ExtractNumber ; // number type StringOrNever = ExtractNumber ; // never
此处,ExtractNumber 类型采用类型参数 T。条件类型检查 T 是否扩展了数字类型。如果是,则类型解析为 T(这是数字类型)。如果不存在,则类型解析为 never。
现在,让我们考虑表达式 A |乙| C 扩展了 A。乍一看这似乎违反直觉,但在 TypeScript 中,这个条件实际上是错误的。原因如下:
type Fruit = "apple" | "banana" | "cherry"; type CitrusFruit = "lemon" | "orange"; type IsCitrus= T extends CitrusFruit ? true : false; type Test1 = IsCitrus; // true type Test2 = IsCitrus; // false type Test3 = IsCitrus ; // false
在此示例中,IsCitrus
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3