TypeScript: error when using parseInt() on a number

匿名 (未验证) 提交于 2019-12-03 08:36:05

问题:

The JavaScript function parseInt can be used to force conversion of a given parameter to an integer, whether that parameter is a string, float number, number, etc.

In JavaScript, parseInt(1.2) would yield 1 with no errors, however, in TypeScript, it throws an error during compilation saying:

error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'. 

Am I missing something here or is it an expected behaviour from TypeScript?

回答1:

Don't use parseInt to do this operation -- use Math.floor.

Using parseInt to floor a number is not always going to yield correct results. parseInt(4e21) returns 4, not 4e21. parseInt(-0) returns 0, not -0.



回答2:

The function parseInt indeed expects a string in its first argument. Please check the documentation. Usually you can omit the second, radix argument and then it will fall back to the default of 10. But the safest is to always add the numeric system base as second argument (usually 10).

If you'd like to cast a general value to number, you can use the Number function, like this.

var myNumber = Number(myGeneralValue); 


回答3:

Look at the typing:

  parseInt(string: string, radix?: number): number;                    ^^^^^^ 

The first argument needs to be a string. That's in line with the spec:

parseInt (string , radix)
The parseInt function produces an integer value dictated by interpretation of the contents of the string argument according to the specified radix.

In normal JS, the first argument is coerced to a string, based on the following rule in the spec:

  1. Let inputString be ToString(string).

which is why parseInt(1.2) works.

Note that the spec allows radix to be undefined, which is the same as omitting it, hence the question mark in the radix?: number part of the signature. In this case, of course, it defaults to 10 (unless the string looks like 0xabc).

As mentioned in other answers, parseInt is not the best solution anyway if what you really want to do is a floor or truncation operation.



回答4:

Why would you use parseInt in this case? Just use Math.floor or Math.ceil. parseInt expects a string as an argument and not a number. Hence your error



回答5:

There are different manifestations when negative numbers between 'Math.floor' and 'parseInt'.

you should use this: 1.2 | 0

or (1.2).toFixed(0)



回答6:

I think other people have already given lots of valid answers here, but in my opinion the easiest approach would be to call .toString() on the original value, and to explicit the radix:

parseInt((1.2).toString(), 10);



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!