Tengo una interfaz (en el ejemplo se llama "Ejemplo") que incluye un tipo de función ("exampleFunction"), pero esta función toma una superclase como parámetro de entrada, y mecanografiado informa un error que indica que no puedo usar subtipos como entrada porque tienen algunas propiedades que no están presentes en el supertipo.
Aquí hay un ejemplo:
interface SuperType { propertyA: string } interface SubTypeA extends SuperType { subPropertyA: number } interface SubTypeB extends SuperType { subPropertyB: number } interface Example { exampleFunction: (input: SuperType) => void }
tengo un problema si escribo:
const example: Example = { exampleFunction: (input: SubTypeA) => {console.log("nothing")} }
El problema es más fácil de detectar si hace que su función use solo la propiedad SubTypeA
.
const example: Example = { exampleFunction: (input: SubTypeA) => {console.log(input.subPropertyA.toFixed())} }
La función en sí es perfectamente válida (acepta un argumento SubTypeA
y accede a una de las propiedades. Sin embargo, el tipo Example
solo puede garantizar que se pase un SuperType
. Por lo tanto, no se puede garantizar que existan las otras propiedades únicas de SubTypeA
.
Por ejemplo:
const superType: SuperType = { propertyA: 'foo' } example.exampleFunction(superType) // valid call, but crashes because `subPropertyA` doesn't exist
¿Quizás una solución es hacer que su función maneje un SuperType
o un SubTypeA
?
const example: Example = { exampleFunction: (input: SuperType | SubTypeA) => { if ('subPropertyA' in input) { console.log(input.subPropertyA.toFixed()) } } } const superType: SuperType = { propertyA: 'foo' } example.exampleFunction(superType) // works const subTypeA: SubTypeA = { propertyA: 'foo', subPropertyA: 123 } example.exampleFunction(subTypeA) // works