我有以下方法,如果它先前已经注册了
,它应该返回一个组件对象/**
* 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];
}
所有内容编译并运行良好,但我的编辑正在发出以下警告......
Property 'x' does not exist on type 'boolean | ComponentInterface'
当我试图跑...
const oPositionComponent = oEntity.getComponent('position');
console.log(oPositionComponent.x);
有没有更好的方式来编写这个,以便我的编辑知道我想要实现的目标?
解决方案
好的,因为我实际上在上一步中检查了组件的存在,我只是输入了返回值...
aEntities = aEntities.filter((oEntity) => {
return oEntity.hasComponent('position');
});
aEntities.forEach((oEntity) => {
const oPositionComponent = <ComponentInterface> oEntity.getComponent('position');
this.context.translate(oPositionComponent.x, oPositionComponent.y);
});
答案 0 :(得分:3)
因为它可能返回false
编译器假定oPositionComponent.x在这种情况下可能会失败。
你可以断言类型(如果你确定你得到组件而不是假的:
console.log((<ComponentInterface>oPositionComponent).x);
但在生产质量代码中,您应该通过type narrowing来处理可能的错误回报:
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");
}