Typescript 在字符串文字上键入guards以细化联合类型

Typescript 在字符串文字上键入guards以细化联合类型,typescript,Typescript,我正在尝试使用具有字符串文本的联合类型,我希望能够使用==: class Color { constructor(public r: number, public g: number, public b: number) { } } interface NodeProperties { fill?: 'none' | Color; } var n: NodeProperties = { fill: new Color(0, 0, 0) }; if (n.fill &

我正在尝试使用具有字符串文本的联合类型,我希望能够使用==:

class Color {
    constructor(public r: number, public g: number, public b: number) {
    }
}

interface NodeProperties {
    fill?: 'none' | Color;
}

var n: NodeProperties = { fill: new Color(0, 0, 0) };

if (n.fill && n.fill !== 'none') {
    console.log(n.fill.r);
}
但是,Typescript认为console.log行中的n.fill类型为
颜色|“none”
。这是预期的吗?使用
n.fill instanceof Color
是优化此类型的唯一方法吗

在一个相关的问题上,当我做的稍微不同时,我得到了一个不同的错误:

class Color {
    constructor(public r: number, public g: number, public b: number) {
    }
}

type Foo = 'none' | Color;

var f: Foo = new Color(0, 0, 0);

if (f !== 'none') {
    console.log(f.r);
}

这里我得到的错误是!==运算符不能应用于颜色和字符串类型。使用时为什么会出现此错误!==在一个裸变量上,但在对象的成员中使用它时不支持?

这在TypeScript 2.0中得到了支持,而标记的联合类型似乎是实现我想做的事情的另一种方式,在联合中使用字符串文字看起来是一种不太臃肿的方式,在这种情况下可以实现相同的结果(不需要额外的接口)。无论如何,感谢您的参考,我可能最终会将我的最终代码切换到标记的联合类型。您的第一个示例。我得到了错误,我用TS 2.0.0进行了描述,但它可以用TS 2.0.3工作。谢谢也许你的第二个例子是TS 2.0.3的一个bug,还有?