Necesito una función de TypeScript para probar si un objeto es de un tipo específico. Si es así, el método debería devolver este tipo. Si no, el método debería devolver indefinido. Quiero usar esta función de la siguiente manera:
const mySpecialObject = isSpecialObject(source); if (mySpecialObject) { console.log(mySpecialObject.getSpecialProperty()); }Intenté exportar una función como esta:
export function isSpecialObject(element: SomeBaseObject): SpecialObject { if (element instanceof SpecialObject) { return element; } return undefined; }Pero el compilador afirmó que 'indefinido' no es asignable de Type SpecialObject
¿Cómo debería verse una función de TypeScript con este comportamiento?
¡Quieres una función de predicado de tipo para hacer esto más seguro!
export function isSpecialObject(element: SomeBaseObject): element is SpecialObject { return element instanceof SpecialObject; } if (isSpecialObject(element)) { // element is safe to use as SpecialObject }También es posible usar una función de predicado de tipo para varios tipos como este:
export function isSpecialObject(element: SomeBaseObject): element is SpecialObject | SpecialObjectSub1 | SpecialObjectSub2 { return element instanceof SpecialObject || element instanceof SpecialObjectSub1 || element instanceof SpecialObjectSub2; }Dado que los dos posibles resultados que devolverá la función son SpecialObject o undefined , se puede agregar undefined como un posible tipo devuelto. como a continuación
export function isSpecialObject(element: SomeBaseObject): SpecialObject | undefined { if (element instanceof SpecialObject) { return element; } return undefined; }