【问题标题】:The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type算术运算的左侧必须是“any”、“number”或枚举类型
【发布时间】:2016-08-02 07:55:18
【问题描述】:
1    interface Dimensions {
2        width: Number,
3        height: Number
4    }
5
6    function findArea(dimensions: Dimensions): Number {    
7        return dimensions.height * dimensions.width;
8    }

第 7 行,dimensions.heightdimensions.width 下的红色波浪线

算术运算的左边必须是'any'类型, 'number' 或枚举类型。

我正在尝试消除红色波浪,但我很难理解为什么打字稿编译器会给我一个错误。据我所知,宽度和高度都是数字类型。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    这是另一个可能对人们有所帮助的错误示例。

    如果您使用打字稿并尝试计算日期之间的差异(在我的情况下,我尝试使用数据库中的 ISO 字符串):

    new Date("2020-03-15T00:47:38.813Z") - new Date("2020-03-15T00:47:24.676Z")
    

    TypeScript Playground

    它会显示错误。

    但是,如果你把它放在浏览器控制台或其他节点环境中,同样的代码也可以工作

    new Date("2020-03-15T00:47:38.813Z") - new Date("2020-03-15T00:47:24.676Z")
    14137
    

    我可能是错的,但我相信这是因为 - 运算符在每个操作数上隐式使用 valueOf。由于 valueOf on Date 返回 number 操作有效。

    但是,打字稿不喜欢它。也许有一个编译器选项会强制这个约束,我不知道。

    new Date().valueOf()
    1584233296463
    

    您可以通过明确地将操作数设置为数字 (bigint) 类型来修复,以便 - 起作用。

    固定示例

    new Date("2020-03-15T00:47:38.813Z").valueOf() - new Date("2020-03-15T00:47:24.676Z").valueOf()
    

    TypeScript Playground

    【讨论】:

    • 不错的一个。我相信这可以作为一个单独的问题添加
    • 我实际上只是在搜索日期问题。并对这个问题感到失望,因为它涉及其他事情。但很高兴在这里看到你的答案。赞成。
    • 我没想到 Typescript 对于一个简单(并且可能被广泛使用)的功能会出现如此意想不到的问题。想知道这是否会得到“修复”?还是故意的?如果有,为什么?
    • 小记:从 JS 中的 Date 对象获取数字的“规范”方式是 .getTime(),但是 .valueOf() 在这种情况下也可以工作并返回相同的结果。
    【解决方案2】:

    【讨论】:

    • 做到了!果然,我仔细检查了sendmail,数字类型肯定是小写的。非常感谢。我不知道为什么我认为它是大写的......
    • 我在一百万年后才在代码中找到这个,它是用大写 N...谢谢。
    【解决方案3】:

    我找到的最干净的方式:

    const diff = +new Date("2020-03-15") - +new Date("2020-03-15")
    

    https://github.com/microsoft/TypeScript/issues/5710

    【讨论】:

      【解决方案4】:

      您可以将表达式转换为数字。

      function findArea(dimensions: Dimensions): Number {    
          return Number(dimensions.height) * Number(dimensions.width);
      }
      

      【讨论】:

        【解决方案5】:

        src/app/demo.component.ts(...) 中的错误:错误 TS2362:算术运算的左侧必须是“任意”、“数字”或枚举类型。

        package.json -

        "dependencies": {
            "@angular/core": "^6.1.10"
        }
        
        "devDependencies": {
            "typescript": "^2.9.2"
        }
        

        代码 -

        dateISOString(d: any): string {
            var nDate = new Date(d);
            var tzoffset = nDate.getTimezoneOffset() * 60000;
            var localISOTime = (new Date(nDate - tzoffset)).toISOString(); // This line gives error
            return localISOTime;
        }
        

        解决方案 - 添加valueOf() 和日期

        var localISOTime = (new Date(nDate.valueOf() - tzoffset.valueOf())).toISOString();
        

        【讨论】:

          【解决方案6】:

          我在减去两个日期时遇到了这个问题,这个错误困扰着我,但程序仍然按预期输出。下面是按日期(从最新到最旧)对对象数组进行排序的代码。

          问题

          var Sorted = Data.sort(function(a,b){ return new Date(b.Posted) - new Date(a.Posted) })

          解决方案

          var Sorted = Data.sort(function(a,b){ return new Date(b.Posted).getTime() - new Date(a.Posted).getTime() })

          • 日期:附加每个值 .getTime() 以将日期转换为数字。
          • 数字:用 parseInt() 包装每个值

          据我了解,此错误不会阻止编译器/程序执行;但是,最好为您的开发环境提供显式/受控变量类型。

          供日后参考; Javscript & Typescript can be unpredictable 在比较/计算某些变量时,因此使用显式类型和转换变量将消除这些警告/错误。

          【讨论】:

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