为什么我不能在联盟上做实例?

时间:2015-03-10 22:21:16

标签: typescript1.4

在这种情况下不允许使用instanceof - 为什么?

public assign(color: string | ColorProperty | RgbProperty | RgbColor): void {
    super.assign(color);

    if (color instanceof ColorProperty) {

ps - 我喜欢工会!!!

2 个答案:

答案 0 :(得分:1)

any必须出现在工会中是不正确的。这也有效。

class Foo { } 
class Bar { }

var x: Foo | Bar = new Foo();
if (x instanceof Foo) {
    // this is ok
}

然而,即使没有结合,这也行不通。

var n: number = 123;
if (n instanceof Foo) {
    // compile error
}

问题在编译器错误中说明。

  

'instanceof'表达式的左侧必须是'any'类型,对象类型或类型参数。

因此,当联合包含any时,您总是被允许将值视为any,这意味着没有编译时限制。否则,编译器仅允许允许应用于任何单个类型的操作。

答案 1 :(得分:0)

似乎instanceof关键字必须在联合中包含类型any才能在函数中使用它。
我的猜测是编译器需要处理所有类型保护返回false的情况 - 因此类型被推断为any

function assign(_color: any | string | ColorProperty | RbgProperty) {
    if (_color instanceof ColorProperty) {
    }
    // else may not be a string | ColorProperty | RbgProperty
}