【问题标题】:TypeScript Boolean XOR -- error TS2113: The left/right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum typeTypeScript Boolean XOR - 错误 TS2113:算术运算的左/右手边必须是“任意”、“数字”或枚举类型
【发布时间】:2014-01-17 07:48:49
【问题描述】:

我有以下代码:

var a: boolean = ...;
var b: boolean = ...;

if (a ^ b) { // this line gives error
  // ...
}

然而,TypeScript 编译器报错:

错误 TS2113:算术运算的左侧必须是“任意”、“数字”或枚举类型。

是因为位运算符只对数字有效吗?如果直接用 JavaScript 编写,代码运行得非常好。

除了if (a ? !b : a) { ... },还有其他选择吗?

更新 鉴于它们都是布尔值,我可以使用a !== b

【问题讨论】:

    标签: typescript


    【解决方案1】:

    根据 TypeScript 规范,正如您所建议的,^ 运算符以及所有其他按位运算符只能应用于数字类型。

    我知道的唯一解决方法是:

    • 选角:<number><any>a ^ <number><any>b
    • 否定相等:a !== b

    我在 GitHub 上打开了一个问题来跟踪它:

    https://github.com/Microsoft/TypeScript/issues/587

    【讨论】:

      【解决方案2】:

      从这个意义上说,Typescript 是 javascript 的一个子集。它编译成 javascript,但你已经知道了。

      编译器只是一个遵循命令的计算机程序,有关'^'操作符的命令是:

      4.15.1 *、/、%、-、>、>>>、&、^ 和 |运营商

      这些运算符要求其操作数为 Any 类型、Number 基本类型或枚举类型。枚举类型的操作数被视为具有基本类型 Number。如果一个操作数是空值或未定义值,则将其视为具有另一操作数的类型。结果始终是 Number 基元类型。

      (来自specs

      我认为你在更新中给出的选项是对你关于替代品问题的回答。

      【讨论】:

        【解决方案3】:

        一种简洁的思考方式:

        function xor(a: any, b: any) {
            return !!a !== !!b;
        }
        
        if (xor(foo, bar)) {
            // DO SOMETHING
        }
        

        我仍然建议在使用此函数之前对其进行测试,尤其是使用数组时。

        祝你好运。

        【讨论】:

          猜你喜欢
          • 2018-06-24
          • 2020-12-30
          • 1970-01-01
          • 1970-01-01
          • 2016-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多