返回Typescript中两种类型之一的方法

时间:2017-04-28 13:41:11

标签: typescript

我有以下方法,如果它先前已经注册了

,它应该返回一个组件对象
/**
 * 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);
});

1 个答案:

答案 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");
}