Estoy tratando de usar un módulo TypeScript de terceros y tengo problemas para crear un tipo abstracto que otros tipos puedan extender.
El tipo base Animal será Mamífero, Reptil o Anfibio.
El método de action de un ActionModule de terceros tomará un tipo ligeramente diferente como entrada para cada acción, pero quería crear un tipo base que se pueda proporcionar para la U genérica de ActionModule para mi tipo ACTIONS .
Esto es lo que tengo hasta ahora, que no parece funcionar (obtiene un error que dice que los tipos son incompatibles).
type Animal = Mammal | Reptile | Amphibian; type Mammal = { name: string, furColor: number }; type Reptile = { name: string, scaleCount: number }; type Amphibian = { name: string; }; // Third-party module interface ActionModule<T = {}, U = {}> { description: string, action: (args: Arguments<U>) => void } const ACTIONS: { [key: string]: ActionModule<{}, Animal> } = { actionOne: { description: '', action: (args: Arguments<Mammal>) => {}, }, actionTwo: { description: '', action: (args: Arguments<Reptile>) => {}, }, actionThree: { description: '', action: (args: Arguments<Amphibian>) => {}, } }TLDR:
type Animal = Mammal & Reptile & AmphibianRespuesta más larga:
Expandiendo y simplificando su código obtenemos:
action: (args: Mammal | Reptile | Amphibian) => voidLo que significa que el argumento de esta función puede tomar cualquiera de los tipos especificados en la unión. Por lo tanto, cada implementación de la interfaz debe admitir todos los tipos de unión .
En su lugar, puede fusionar las interfaces , lo que significa que el método puede admitir uno de los tipos . Más específicamente, permitirá un objeto que tenga al menos propiedades comunes de las interfaces.