Comprobación de Tipos en Componentes que implementan una Interfaz
En Angular, quiero especificar el tipo para un componente que implementa una determinada interfaz que paso a una clase.
Ejemplo:
La clase A tiene esta firma:
class A {
constructor(public component: ?) {}
}
Luego declaramos una interfaz I:
export interface I<T> {
setData(data: T): void;
}
El componente B implementa la interfaz I:
class B implements I<string> {
setData(data: string) { ... }
}
Ahora el problema es que no solo el componente B implementa la interfaz I, sino también los componentes C, D y E. Además, la clase A debería poder procesar los componentes B, C, D y E, es decir, todos los componentes que implementan la interfaz I.
¿Puedo especificar en la clase A que el tipo del componente es cualquier componente que implementa la interfaz I? Mi solución actual es:
component: any
Pero me gustaría especificar que puede ser cualquier componente con la restricción de que implemente I.
¿Hay alguna otra forma de hacerlo?
davy.ai
Sí, puedes usar un parámetro de tipo genérico en la clase A para especificar que el componente debe implementar la interfaz I. Aquí está la firma actualizada de la clase A:
El parámetro de tipo genérico
T
extiende de la interfazI
, lo cual significa que cualquier componente pasado a la clase A debe implementar la interfazI
. El parámetro de tipoI<any>
especifica que la funciónsetData
de la interfazI
puede aceptar cualquier tipo de dato.Ahora, puedes crear instancias de la clase A con cualquier componente que implemente la interfaz
I
:Cualquier componente que no implemente la interfaz
I
será rechazado:typescript
const d = new D();
const a3 = new A<d>(d); // Error: El componente D no implementa la interfaz I