Método que devuelve uno de dos tipos en Typescript
Tengo el siguiente método que se supone devuelve un objeto componente si ha sido registrado previamente
/**
* Retrieve a component
* @param string sComponentName The name of the component to look for
* @return ComponentInterface | boolean
*/
public getComponent(sComponentName: string): boolean | ComponentInterface {
if(!this.hasComponent(sComponentName)) {
return false;
}
return this.components[sComponentName];
}
Todo se compila y ejecuta bien, pero mi editor está mostrando la siguiente advertencia...
Property 'x' does not exist on type 'boolean | ComponentInterface'
cuando intento ejecutar...
const oPositionComponent = oEntity.getComponent('position');
console.log(oPositionComponent.x);
¿Hay una mejor manera de escribir esto para que mi editor sepa lo que estoy tratando de lograr?
Solución
Ok, así que como en el paso anterior en realidad estaba verificando la existencia del componente, simplemente hice un cast de tipo en el valor devuelto...
aEntities = aEntities.filter((oEntity) => {
return oEntity.hasComponent('position');
});
aEntities.forEach((oEntity) => {
const oPositionComponent = <ComponentInterface> oEntity.getComponent('position');
this.context.translate(oPositionComponent.x, oPositionComponent.y);
});
Respuesta #1
Dado que puede devolver false, el compilador asume que oPositionComponent.x puede fallar en este caso. Puedes afirmar el tipo (si estás seguro de que obtendrías el componente y no false):
console.log((<ComponentInterface>oPositionComponent).x);
Pero en código de calidad de producción deberías manejar posibles devoluciones falsas mediante la restricción de tipos:
if (oPositionComponent instanceof ComponentInterface) { // this will only work with classes, not interfaces (?)
console.log(oPositionComponent.x);
} else { // this must be false
console.log("component is not registered");
}
