具有各种接口的打字稿联合体类型

时间:2018-06-20 13:04:50

标签: typescript tslint union-types

我正在尝试定义一个包含对象的对象模型。该对象可以是两种不同类型的对象。

export interface EventParams {
    evtType: string;
    evtData: FaultOrGoalData| SwapData;
}

export interface FaultOrGoalData {
    evtName: string;
    player: string;
    position: string;
}

export interface SwapData {
    swapPlayer: string;
}

我的问题是ts lint告诉我不可能访问封装对象中包含的数据。

示例:params.evtData.evtName

因此,我的问题是:是否可以使用接口创建联合类型?

1 个答案:

答案 0 :(得分:5)

是的,您可以创建带有接口的联合,就像刚才那样,但是您只能访问联合的普通成员。您可以使用类型防护来缩小类型,然后可以访问特定成员。在这种情况下,您可以使用in类型防护:

declare let foo: EventParams;
if('evtName' in foo.evtData) {
    foo.evtData.evtName //foo.evtData is of type FaultOrGoalData
}else {
    foo.evtData.swapPlayer // foo.evtData is of type SwapData
}