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

ben*_*inz 20 javascript typescript

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

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

error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.
Run Code Online (Sandbox Code Playgroud)

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

Rya*_*ugh 27

不要parseInt用来做这个操作 - 使用Math.floor.

使用parseIntfloor一些并不总是会产生正确的结果.parseInt(4e21)回报4,而不是4e21.parseInt(-0)回报0,而不是-0.

  • 问题要求`string | number``Math.floor()` 只接受 `number`,所以它也不起作用。其他答案之一建议使用“Number()”,但它可能会为您留下一个带小数位的数字。`Math.floor(Number(stringOrNumber))` 似乎是一个明智的选择,但 `parseInt("" + row.c, 10)` 似乎也可以接受。 (4认同)
  • 我不认为这是正确的方法。这将产生一个没有小数部分的浮点数。但实际上它不是一个整数。例如,如果将其除以整数,则您将期望得到浮点数。 (2认同)

Gio*_*sta 10

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

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


Zol*_*ási 7

该函数parseInt确实期望string第一个参数.请查看文档.通常你可以省略第二个radix参数,然后它将回退到默认值10.但最安全的是始终将数字系统库添加为第二个参数(通常10).

如果你想一个一般的价值number,你可以使用Number功能,像这样.

var myNumber = Number(myGeneralValue);
Run Code Online (Sandbox Code Playgroud)

  • “如果此参数不是字符串,则使用 ToString 抽象操作将其转换为字符串。”文档并未真正描述它应具有的所需类型。由于历史原因,输入参数简称为“字符串”。 (3认同)

小智 5

看一下打字:

  parseInt(string: string, radix?: number): number;
                   ^^^^^^
Run Code Online (Sandbox Code Playgroud)

第一个参数必须是字符串。这符合规范:

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

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

  1. inputString为 ToString( string )。

这就是为什么parseInt(1.2)有效。

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

正如其他答案中提到的,parseInt如果您真正想做的是取整或截断操作,那么无论如何都不是最好的解决方案。


Msm*_*mkt 5

有点旧,但可以用另一种方式放入锅中:

Math.trunc();

请参阅此处了解详细信息。