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

时间:2016-04-11 23:04:44

标签: 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    }

第7行,dimensions.heightdimensions.width

下的红色波浪线
  

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

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

4 个答案:

答案 0 :(得分:46)

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

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

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

TypeScript Playground

它将显示错误。 enter image description here

但是,如果将其放在浏览器控制台或其他节点环境中,则可以使用相同的精确代码

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

我可能是错的,但是我相信由于-运算符在每个操作数上都隐式使用valueOf,因此可以使用。由于日期上的valueOf返回了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

答案 1 :(得分:33)

答案 2 :(得分:0)

<块引用>

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();

答案 3 :(得分:0)

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

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