请考虑下面的简单联合类型示例:
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类型由Alarm
和Car
等不同接口组成时,我无法再访问alarmText
属性。我理解它的方式是编译器无法推断我指的是警报对象。只能在联合类型中访问非脱节属性。正确?
如果这是正确的,一旦在联合类型的变量中声明原始报警对象,我怎么能得到它? 我首先虽然可以像
那样做一个类型后卫if (typeof bar === 'Alarm') {
bar.alarmText
}
但typeof bar
只是'object'
,因此gaurd没有任何意义。
任何?
答案 0 :(得分:0)
您可以编写自定义类型防护来实现此目的:
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;
}