算术运算的左侧必须是"any","number"或枚举类型

jra*_*ali 13 typescript

1    interface Dimensions {
2        width: Number,
3        height: Number
4    }
5
6    function findArea(dimensions: Dimensions): Number {    
7        return dimensions.height * dimensions.width;
8    }
Run Code Online (Sandbox Code Playgroud)

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

算术运算的左侧必须是"any","number"或枚举类型.

我正在努力消除红色波浪形,但我很难过为什么这个打字稿编译器给了我一个错误.据我所知,宽度和高度都是Number类型.

Mat*_*ola 119

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

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

new Date("2020-03-15T00:47:38.813Z") - new Date("2020-03-15T00:47:24.676Z")
Run Code Online (Sandbox Code Playgroud)

打字稿游乐场

它会显示错误。 在此处输入图片说明

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

new Date("2020-03-15T00:47:38.813Z") - new Date("2020-03-15T00:47:24.676Z")
14137
Run Code Online (Sandbox Code Playgroud)

我可能是错的,但我相信这是由于-运算符隐式使用valueOf它的每个操作数。由于valueOf日期返回一个number操作有效。

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

new Date().valueOf()
1584233296463
Run Code Online (Sandbox Code Playgroud)

您可以通过显式地使操作数编号 (bigint) 类型进行修复,以便-工作。

固定示例

new Date("2020-03-15T00:47:38.813Z").valueOf() - new Date("2020-03-15T00:47:24.676Z").valueOf()
Run Code Online (Sandbox Code Playgroud)

打字稿游乐场

  • 小提示:在 JS 中从 `Date` 对象获取数字的“规范”方法是 `.getTime()`,但是 `.valueOf()` 在这种情况下也可以工作并返回相同的结果。 (8认同)
  • 好一个。我相信这可以作为一个单独的问题添加 (6认同)
  • 我没想到 Typescript 对于一个简单(并且可能广泛使用)的功能会出现如此意想不到的问题。想知道这个问题是否会得到“解决”?还是故意的?如果是这样,为什么? (4认同)
  • 这个问题不是我想要的,但这个答案却是我需要的。 (4认同)
  • 我实际上只是在寻找日期问题。对这个问题感到失望,因为它涉及其他事情。但很高兴在这里看到你的答案。已投赞成票。 (3认同)

Saj*_*jad 51

我发现的最干净的方法:

const diff = +new Date("2020-03-15") - +new Date("2020-03-15")
Run Code Online (Sandbox Code Playgroud)

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


sam*_*war 11

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

function findArea(dimensions: Dimensions): Number {    
    return Number(dimensions.height) * Number(dimensions.width);
}
Run Code Online (Sandbox Code Playgroud)


小智 7

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

问题

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 可能是不可预测的,因此使用显式类型和转换变量将消除这些警告/错误。