【问题标题】:Accessing properties in union types访问联合类型中的属性
【发布时间】:2017-08-25 22:24:42
【问题描述】:

请考虑下面的简单联合类型示例:

interface Alarm {
    alarmText: string,
    quali: number
}

interface Car {
    speed: number
}

type unionT = Alarm | Car;


var alarm: Alarm = {
    alarmText: "ALARM!!!",
    quali: 42
};

var bar: unionT = alarm;

bar.alarmText // ERROR

当 unionT 类型由 AlarmCar 等不同接口组成时,我无法再访问 alarmText 属性。我理解它的方式是编译器无法推断我指的是警报对象。在联合类型中只能访问不相交的属性。对吧?

如果这是正确的,一旦在联合类型的变量中声明了原始警报对象,我该如何取回它? 我首先虽然我可以做一个类型保护,比如

if (typeof bar === 'Alarm') {
    bar.alarmText
}

typeof bar 只是'object',因此 gaurd 没有任何意义。

有人吗?

【问题讨论】:

  • 顺便说一句,这在 TypeScript 2.3 中无需更改即可工作

标签: typescript


【解决方案1】:

您可以编写自定义类型保护来实现此目的:

function isAlarm(a: Alarm | Car): a is Alarm {
    // Some check to see if this is an Alarm
    return (<Object>a).hasOwnProperty('alarmText');
}


if (isAlarm(bar)) {
    bar.alarmText;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多