TypeScript:在数字上使用parseInt()时出错

时间:2016-09-13 16:47:16

标签: javascript typescript

JavaScript函数parseInt可用于强制将给定参数转换为整数,无论​​该参数是字符串,浮点数,数字等。

在JavaScript中,parseInt(1.2)会产生1而没有错误,但是,在TypeScript中,它会在编译时抛出错误:

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

我在这里遗漏了什么,或者是TypeScript的预期行为?

7 个答案:

答案 0 :(得分:26)

请勿使用parseInt执行此操作 - 请使用Math.floor

使用parseIntfloor数字并不总能产生正确的结果。 parseInt(4e21)返回4,而不是4e21parseInt(-0)返回0,而不是-0

答案 1 :(得分:6)

函数parseInt确实在第一个参数中需要string。请检查the documentation。通常,您可以省略第二个radix参数,然后它将回退到默认值10。但最安全的是始终将数字系统库添加为第二个参数(通常为10)。

如果您想常规投射到number,您可以使用Number函数,就像这样。

var myNumber = Number(myGeneralValue);

答案 2 :(得分:3)

查看输入:

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

第一个参数需要是一个字符串。这符合规范:

  

parseInt (string , radix)
       parseInt 函数根据指定的 radix 生成一个整数值,该值由解释 string 参数的内容决定。

在普通的JS中,第一个参数被强制转换为字符串,基于规范中的以下规则:

  
      
  1. inputString 为ToString( string )。
  2.   

这就是parseInt(1.2)的原因。

请注意,规范允许 radix undefined,这与省略它相同,因此签名的radix?: number部分中存在问号。在这种情况下,当然,它默认为10(除非字符串看起来像0xabc)。

正如其他答案中所提到的,parseInt无论如何都不是最好的解决方案,如果你真正想做的是楼层或截断操作。

答案 3 :(得分:2)

为什么在这种情况下你会使用parseInt?只需使用Math.floorMath.ceil即可。 parseInt期望字符串作为参数而不是数字。因此你的错误

答案 4 :(得分:1)

当Math.floor'之间的负数有不同的表现形式。和' parseInt'。

你应该使用这个: 1.2 | 0

或(1.2).toFixed(0)

答案 5 :(得分:1)

我认为其他人已经在这里给出了很多有效的答案,但在我看来,最简单的方法是在原始值上调用.toString(),并明确基数:

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

答案 6 :(得分:0)

有些陈旧,但需要另辟way径:

Math.trunc();

有关详细信息,请参见here