Hub*_*Kai 6 typescript typescript1.4
我用谷歌搜索了最后一小时,我没有找到一个很好的答案或解释我的问题.
我有一个成员变量定义为联合类型,基元(数字)或接口(KnockoutObservable),我不能使用instanceof或typeof typeguards而不会产生错误.我正在使用带有Typescript 1.4的VS2013更新4.我已经设置了几个例子来证明这个问题:
class foo {
foo() {}
}
class bar {
bar() {}
}
interface baz {
baz();
}
// This case breaks
var var1: number|foo;
if (typeof var1 === "number") {
var1 = 5;
}
// Generates error "The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter."
else if (var1 instanceof foo) {
var1.foo();
}
// This also breaks, same error as above
if (var1 instanceof number) {
var1 = 5;
}
else if (var1 instanceof foo) {
var1.foo();
}
// This case works
var var2: foo|bar;
if (var2 instanceof foo) {
var2.foo();
}
else if (var2 instanceof bar) {
var2.bar();
}
// This case breaks as well
var var3: foo|baz;
if (var3 instanceof foo) {
var3.foo();
}
// Generates error: "Cannot find name 'baz'."
else if (var3 instanceof baz) {
var3.baz();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么案例1和3会破裂?我们正在创建KnockoutJS组件,其中参数可以是可观察的或原始的.由于KnockoutObservable是一个接口,因此在我们的模式中几乎可以关闭能够使用union类型; 如果我们希望参数是我们必须恢复使用'any'.
我发现的一些事情(比如这里)似乎意味着这在1.5中得到了修复.有人可以给我这个吗?
请注意,在函数体中的任何位置分配给变量会“关闭”该变量上的类型保护,因此我从本示例中删除了分配。
基本上,有一种情况按预期工作,一种情况应该工作但没有,一种情况因为没有接口的运行时类型信息而不起作用。instanceof是一个检查对象原型链的 JavaScript 运算符,而不是用于执行类型操作的 TypeScript 构造。
var var1: number|foo;
// OK
if (typeof var1 === "number") { }
// Bug #2775
// https://github.com/Microsoft/TypeScript/issues/2775
if (var1 instanceof foo) { }
if (var1 instanceof number) { }
// OK
var var2: foo|bar;
if (var2 instanceof foo) { }
if (var2 instanceof bar) { }
// TypeScript does not have reflection; there is no
// value 'baz' to 'instanceof' at runtime.
if (var3 instanceof baz) {
var3.baz();
}
Run Code Online (Sandbox Code Playgroud)
有关错误x instanceof number也是故意的;没有运行时值number。你可能会想写x instanceof Number;这将是一个错误(42 instanceof Number是false,不是true)。
| 归档时间: |
|
| 查看次数: |
1526 次 |
| 最近记录: |