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

Flo*_*dis 2 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;
}
Run Code Online (Sandbox Code Playgroud)

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

例: params.evtData.evtName

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

Tit*_*mir 6

是的,您可以创建带有接口的联合,就像刚才那样,但是您只能访问联合的普通成员。您可以使用类型防护来缩小类型,然后可以访问特定成员。在这种情况下,您可以使用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
}
Run Code Online (Sandbox Code Playgroud)