以下代码给出了错误:
enum E { FIRST = 1, SECOND = 2 };
class C {
value: E;
constructor(arg: C | E) {
if (arg instanceof C) { // 1.
this.value = arg.value;
} else {
this.value = arg; // 2.
}
}
}
var a: C = new C(E.SECOND);
console.log('a.value = ' + a.value);
var b: C = new C(a);
console.log('b.value = ' + b.value);
尽管有错误,代码似乎在TypeScript Playground上正常编译并且符合预期。
答案 0 :(得分:6)
两个问题。
编译器中存在一个错误,当其中一个成分不是对象类型时,联合类型不允许instanceof
。这是固定的(https://github.com/Microsoft/TypeScript/issues/2775)
另一件事是instanceof
不会导致else
块(https://github.com/Microsoft/TypeScript/issues/1719)缩小,因为instanceof
检查失败不一定 表示对象与指定的接口不匹配。这是目前“按设计”,但我鼓励你留下评论,你发现这种行为令人惊讶或不受欢迎(我当然这样做)。
答案 1 :(得分:3)
class C {
value: E;
constructor(arg: C | number) {
if(typeof arg === 'number') {
this.value = arg;
} else {
this.value = arg.value;
}
}
}
这种相当令人讨厌的解决方案依赖于枚举和数字愉快地共同发挥作用的事实。您还可以从typeof
检查缩小else
语句的副作用中受益。