Das Schlüsselwort „extens“ in TypeScript ist eine Art Schweizer Taschenmesser. Es wird in mehreren Kontexten verwendet, einschließlich Vererbung, Generika und bedingten Typen. Wenn Sie verstehen, wie Sie Erweiterungen effektiv nutzen, können Sie robusteren, wiederverwendbareren und typsichereren Code erstellen.
Eine der Hauptanwendungen von Erweiterungen ist die Vererbung, die es Ihnen ermöglicht, neue Schnittstellen oder Klassen zu erstellen, die auf vorhandenen aufbauen.
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" };
In diesem Beispiel erweitert StaffUser den Benutzer, erbt alle seine Eigenschaften und fügt neue hinzu. Dadurch können wir spezifischere Typen basierend auf allgemeineren erstellen.
Das Schlüsselwort „extends“ wird auch für die Klassenvererbung verwendet:
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!
Hier erweitert Dog Animal, erbt dessen Eigenschaften und Methoden und fügt auch eigene hinzu.
Das Schlüsselwort „extens“ ist bei der Arbeit mit Generika von entscheidender Bedeutung, da es uns ermöglicht, die Typen einzuschränken, die mit einer generischen Funktion oder Klasse verwendet werden können.
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
Zusammenfassend lässt sich sagen, dass das Schlüsselwort „extens“ im Kontext der Funktion printObject
T extends U ? X : Y
type ExtractNumber= T extends number ? T : never; type NumberOrNever = ExtractNumber ; // number type StringOrNever = ExtractNumber ; // never
Hier akzeptiert der ExtractNumber-Typ einen Typparameter T. Der bedingte Typ prüft, ob T den Zahlentyp erweitert. Wenn dies der Fall ist, wird der Typ in T aufgelöst (das ist der Zahlentyp). Ist dies nicht der Fall, wird der Typ in „nie“ aufgelöst.
Betrachten wir nun den Ausdruck A | B | C erweitert A. Dies mag zunächst kontraintuitiv erscheinen, aber in TypeScript ist diese Bedingung tatsächlich falsch. Hier ist der Grund:
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
In diesem Beispiel ist IsCitrus
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3