打字稿:如何在联合类型中为枚举添加类型保护?

Gra*_*hau 4 enums types typescript

以下代码给出了错误:

  1. 'instanceof'表达式的左侧必须是'any'类型,对象或类型参数.
  2. 输入'E | C'不能分配给'E'类型.类型"C"不能分配给"E"类型.
    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);
Run Code Online (Sandbox Code Playgroud)

尽管有错误,但代码似乎可以在TypeScript Playground上正常编译并完成预期的操作.

Rya*_*ugh 6

两个问题.

instanceof当其中一个成分不是对象类型时,编译器中存在一个错误,该错误在联合类型上是不允许的.这是修复的(https://github.com/Microsoft/TypeScript/issues/2775)

另一件事是instanceof不会导致else块中的缩小(https://github.com/Microsoft/TypeScript/issues/1719),因为instanceof检查失败并不一定意味着对象与指定的接口不匹配.这是目前"按设计",但我鼓励你留下评论,你发现这种行为令人惊讶或不受欢迎(我当然这样做).