Un argumento de tipo (es decir, tipo real) no declara "extends supertipo". Pero su parámetro de tipo correspondiente sí declara "extends supertipo". ¿Cómo permite Typescript esta relajación en la concordancia de declaración de supertipos?
Vamos a desglosarlo con un ejemplo para entenderlo mejor.
Entendiendo el funcionamiento en la garantía de concordancia de supertipos
Genéricos y Restricciones
Primero, recordemos qué son los genéricos y las restricciones:
-
Genéricos (
<T>
): Permiten escribir componentes o funciones que pueden trabajar con cualquier tipo de dato, manteniendo la flexibilidad y la seguridad de tipos.T
es un marcador de posición para el tipo real que se usará. -
Restricciones de Tipo (
extends
): A menudo, no quieres que tu genérico funcione con cualquier tipo, sino solo con tipos que tengan ciertas propiedades o que hereden de una clase específica. Usasextends
para aplicar estas restricciones.Ejemplo de restricción:
TypeScriptinterface HasId { id: string; } interface MyObject { // Observar que no declara "extends HasId" id: string; pepe: string; } // T debe ser un tipo que tenga una propiedad 'id' de tipo string function processItem<T extends HasId>(item: T) { console.log(`Processing item with ID: ${item.id}`); }
La concordancia de supertipos en Cuestión
Ocurriría un error si intentaras llamar a processItem
con un tipo T
que no tiene la propiedad id
(o no es de tipo string
), o si le falta alguna otra propiedad o método que HasId
(el "supertipo" o la "restricción") espera.
Pero ¿Por qué el siguiente ejemplo no es un error?
myObject = new MyObject();
myObject.id = "123";
myObject.pepe = "abc";
function processItem(myObject) { // MyObject es un buen sustituto de T porque tiene la propiedad 'id' de tipo string
console.log(`Processing item with ID: ${item.id}`);
}
La clave está en que no hace falta que en la declaración de MyObject diga "extends HasId". En cambio, Typescript chequea miembro a miembro que MyObject, como cualquier sustituto de T, tenga las mismas propiedades con los mismos tipos que HasId.
En resumen, la validación de Typescript de subtipado funciona a partir de la concordancia de propiedades, funciones y sus tipos de datos, y no de la declaración "extends".
No hay comentarios:
Publicar un comentario