Typescript:如何为联合类型中的枚举添加类型保护?

Typescript:如何为联合类型中的枚举添加类型保护?,types,enums,typescript,Types,Enums,Typescript,以下代码给出了错误: “instanceof”表达式的左侧必须是“any”类型、对象或类型参数 类型“E | C”不可分配给类型“E”。类型“C”不可分配给类型“E” 尽管有这些错误,代码似乎编译得很好,达到了预期效果。两个问题 编译器中存在一个错误,当联合类型的一个组成部分不是对象类型时,instanceof不允许用于联合类型。正在修复此问题() 另一件事是instanceof不会导致else块()中的变窄,因为instanceof检查失败并不一定意味着对象与指定接口不匹配。这是目前的“设计”

以下代码给出了错误:

  • “instanceof”表达式的左侧必须是“any”类型、对象或类型参数
  • 类型“E | C”不可分配给类型“E”。类型“C”不可分配给类型“E”
  • 尽管有这些错误,代码似乎编译得很好,达到了预期效果。

    两个问题

    编译器中存在一个错误,当联合类型的一个组成部分不是对象类型时,
    instanceof
    不允许用于联合类型。正在修复此问题()


    另一件事是
    instanceof
    不会导致
    else
    块()中的变窄,因为
    instanceof
    检查失败并不一定意味着对象与指定接口不匹配。这是目前的“设计”,但我鼓励你留下一条评论,你会发现这种行为令人惊讶或不受欢迎(我当然会这样做)。

    Ryan当然是口才和准确的,但我可以为你提供一个临时解决办法,你可能会觉得有用。尽管它可能会被使用,但请不要接受这一答案,因为从长远来看,解决与类型保护相关的问题会更好

    class C {
        value: E;    
    
        constructor(arg: C | number) {
            if(typeof arg === 'number') {
                this.value = arg;
            } else {
                this.value = arg.value;
            }
        }
    }
    

    这个相当令人讨厌的解决方案依赖于枚举和数字可以愉快地一起玩这一事实。您还可以受益于
    typeof
    检查缩小
    else
    语句的副作用。

    PS:一个简单的解决方法是将联合类型替换为类型“any”,尽管这与TypeScript的思想相矛盾。我将采用此修复方法,因为枚举/数字参数的频率要高得多,因此,无论如何,它的测试应该排在第一位。
    class C {
        value: E;    
    
        constructor(arg: C | number) {
            if(typeof arg === 'number') {
                this.value = arg;
            } else {
                this.value = arg.value;
            }
        }
    }