La palabra clave extends en TypeScript es una especie de navaja suiza. Se utiliza en múltiples contextos, incluidos herencia, genéricos y tipos condicionales. Comprender cómo utilizar las extensiones de manera eficaz puede generar un código más sólido, reutilizable y con seguridad de escritura.
Uno de los usos principales de las extensiones es la herencia, lo que le permite crear nuevas interfaces o clases que se basan en las existentes.
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" };
En este ejemplo, StaffUser extiende Usuario, heredando todas sus propiedades y agregando otras nuevas. Esto nos permite crear tipos más específicos basados en otros más generales.
La palabra clave extends también se utiliza para la herencia de clases:
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!
Aquí, Perro extiende Animal, heredando sus propiedades y métodos, y también agregando los suyos propios.
La palabra clave extends es crucial cuando se trabaja con genéricos, ya que nos permite restringir los tipos que se pueden usar con una función o clase genérica.
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
En resumen, la palabra clave extends en el contexto de la función printObject
T extends U ? X : Y
type ExtractNumber= T extends number ? T : never; type NumberOrNever = ExtractNumber ; // number type StringOrNever = ExtractNumber ; // never
Aquí, el tipo ExtractNumber toma un parámetro de tipo T. El tipo condicional verifica si T extiende el tipo de número. Si es así, el tipo se resuelve en T (que es el tipo de número). Si no es así, el tipo se resuelve en nunca.
Ahora, consideremos la expresión A | B | C extiende A. Esto puede parecer contradictorio al principio, pero en TypeScript, esta condición es en realidad falsa. He aquí por qué:
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
En este ejemplo, IsCitrus
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3