Ключевое слово расширяется в TypeScript — это своего рода швейцарский армейский нож. Он используется во многих контекстах, включая наследование, дженерики и условные типы. Понимание того, как эффективно использовать расширения, может привести к созданию более надежного, многократно используемого и типобезопасного кода.
Одним из основных применений расширений является наследование, позволяющее создавать новые интерфейсы или классы, основанные на существующих.
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, наследуя все его свойства и добавляя новые. Это позволяет нам создавать более конкретные типы на основе более общих.
Ключевое слово расширяется также используется для наследования классов:
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, наследуя его свойства и методы, а также добавляя свои собственные.
Ключевое слово Extensions имеет решающее значение при работе с универсальными шаблонами, позволяя нам ограничить типы, которые можно использовать с универсальной функцией или классом.
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
Подводя итог, ключевое слово Extensions в контексте функции 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 (который является числовым типом). Если это не так, тип разрешается как никогда.
Теперь давайте рассмотрим выражение 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