TypeScript 联合类型的问题

interface ModuleA{
    width: number;
    height: number;
}

interface ModuleB{
    width: number;
    offset: number;
}

function test(params: ModuleA | ModuleB): any{
    console.log(params.offset);
}

TypeScript 中联合声明,
像这种情况,会抛出错误,大意就是ModuleA不存在offset的属性。
请问该如何解决这个问题

阅读 2.5k
1 个回答

你的代码中params可以是ModuleA或者ModuleB类型。 如果传入一个ModuleA类型,那么就没有params.offset这个属性,所以不能通过检查(这也是你使用TypeScript的意义所在),于是报错,毫无疑问。


方案1:

可以看看User-Defined Type Guards

interface ModuleA{
    width: number;
    height: number;
}

interface ModuleB{
    width: number;
    offset: number;
}
function isModuleA(param: ModuleA | ModuleB): param is ModuleA {
    return (<ModuleA>param).height !== undefined;
}

function test(params: ModuleA | ModuleB): any{
    if(isModuleA(params)){
    console.log(params.height);
    }else{
    console.log(params.offset);
    }
}
const foo:ModuleA={width:3,height:0};
test(foo);

方案2

当然你也可以给ModuleA添加一个可选的offset属性。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题