【问题标题】:The right hand side of an arithmetic operation must be of type 'any', 'number' or an enum type算术运算的右侧必须是“any”、“number”或枚举类型
【发布时间】:2018-07-26 12:44:40
【问题描述】:

我在 JS 中有这段代码,我需要让它在 TypeScript 中工作。
它一直在说:

算术运算的右侧必须是“任意”、“数字”或枚举类型

sort(field, reverse, primer) {  
    var key = primer ? 
    function(x) {return primer(x[field])} : 
    function(x) {return x[field]};

    reverse = [-1, 1][+!!reverse];

    return function (a, b) {
        return a = key(a), b = key(b), reverse * ((a > b)) - (b > a));
    } 
}

有什么想法吗?

【问题讨论】:

  • reverse * ((a > b)) 这是数字 * 布尔值。
  • @ASDFGerte 是,但- 将转换回数字。在任何情况下,OP 都有 Typescript 代码,而不是 JavaScript 代码。
  • @Pointy,是的,这正是错误消息的含义,这是一个编译时错误,因为他正在使用算术运算,其中一个操作数的推断类型是布尔值。
  • 在应用任何算术之前将任何布尔值转换为数字
  • @ASDFGerte 啊,对,好点 :) 我不是 Typescript 用户,所以我猜我对它抱怨的内容没有太多感觉。

标签: javascript typescript


【解决方案1】:

问题

(a > b)(b > a) 都返回boolean,另外((a > b)) 的括号太多了。

要解决此问题,boolean 的两个结果都必须转换为 number。 这可以通过以下 3 种方法之一来实现:

1. +bool
2. bool ? 1 : 0
3. Number(bool)

解决方案(使用方法#1):

sort(field, reverse, primer) {  
    var key = primer ? 
    function(x) {return primer(x[field])} : 
    function(x) {return x[field]};

    reverse = [-1, 1][+!!reverse];

    return function (a, b) {
        return a = key(a), b = key(b), reverse * (+(a > b) - +(b > a));
    } 
}

注意:

使用(+(a > b) - (b > a)) 将不起作用,因为- 不能用作算术转换而是减法,因此会保持类型错误。

【讨论】:

  • 哇哦!就像把 Number()
【解决方案2】:

我遇到了这个错误,因为我使用的是 Typescript 并将变量标记为 Number 而不是 number

哎呀! Typescript 文档确实提到不要使用Number

https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#the-primitives-string-number-and-boolean

我打开了一个问题https://github.com/microsoft/TypeScript/issues/45460

【讨论】:

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