TypeScript isNan只接受一个数字

Alo*_*lon 30 javascript node.js webstorm typescript

我使用WebStorm 2016.2.2,TypeScript 2.1,Node.js.

出于某种原因,isNan声明为只接受数字的函数:

declare function isNaN(number: number): boolean;
Run Code Online (Sandbox Code Playgroud)

我试图将其改为任何,但看起来它不会对TSC产生影响.我仍然得到同样的错误:

'string'类型的参数不能分配给'number'类型的参数

我的代码(简化):

isNan("10");
Run Code Online (Sandbox Code Playgroud)

我该如何解决/解决它?


编辑:

请注意,根据规范,isNan的参数可以是任何类型:Number.isNan()

另外:我的代码被简化了.我实际上收到一个参数,可能是一个字符串或一个数字,如果它是一个字符串,它可能是一个我希望转换为数字("10")的字符串数字或一个简单的字符串("Hello world") .

我不想通过包含我的整个代码来解决这个问题,但是因为它引起了混乱,这是我真正的代码:

            if (typeof expectedValue === "string" && !isNaN(expectedValue)) {
                    expectedValue = +expectedValue;
                }

            if (typeof actualValue === "string" && !isNaN(ctualValue)) {
                actualValue = +actualValue;
            }

            switch (this.operator) {
                case Operator.equal:
                    return actualValue == expectedValue;
                case Operator.notEqual:
                    return actualValue === undefined || actualValue != expectedValue;
                case Operator.greaterThan:
                    return actualValue > expectedValue;
                case Operator.littleThan:
                    return actualValue < expectedValue;
                case Operator.greaterOrEqual:
                    return actualValue >= expectedValue;
                case Operator.littleOrEqual:
                    return actualValue <= expectedValue;
            }
Run Code Online (Sandbox Code Playgroud)

Nit*_*mer 26

我建议你以不同的方式实现你的代码.
原因:

  1. 它可能很短,但要理解发生的事情并不容易
  2. 使用isNaN是不是最好的选择在这里:isNaN("")回报false以及

你最好尝试将值转换为数字并检查是否存在NaN(如@smnbbrv所写):

if (typeof expectedValue === "string" && !Number.isNaN(Number(expectedValue))) {
    expectedValue = Number(expectedValue);
}
Run Code Online (Sandbox Code Playgroud)

编辑

您可以将您的价值传递给any:

isNaN(ctualValue as any)
Run Code Online (Sandbox Code Playgroud)

绕过编译器检查.

  • 由于 `Number("")` 是 `0`,所以 `isNaN(Number(""))` 将*仍然*返回 false... (3认同)
  • 1up 表示“任意”。 (2认同)

smn*_*brv 9

你不应该解决它,因为这是JavaScript的工作方式.

只需将输入转换为数字

Number("10") // 10
Number("abc") // NaN
Run Code Online (Sandbox Code Playgroud)

然后使用isNan函数检查结果:

isNaN(Number("abc"))
Run Code Online (Sandbox Code Playgroud)

  • 它通常建议避免使用`Number()`,`String()`和`Boolean()`函数.可能更好地使用`parseInt()`和`parseFloat()`. (2认同)
  • @ScottMarcus你可能在谈论`new Number()`,通常应该避免(因为它不是创建文字,而是创建对象),如果我没记错的话,在ES6中不推荐使用; 但是`Number()`没有任何问题.如果确实如此,请澄清 (2认同)
  • 请澄清为什么它是坏的。我经常使用它,我没有任何问题。这并不是说我告诉你错了;我真的很想知道改进我的代码是否是一种不好的做法 (2认同)
  • @ScottMarcus不是'parseInt('0x11')`还返回17? (2认同)
  • @Paarth是的,但是你从来没有打算使用没有`radix`的`parseInt` - `parseInt('0x11')// => 17` vs`parseInt('0x11',10)// => 0` . (2认同)
  • 我仍然不同意使用 `Number` 有点不好。与所有事情一样,您必须考虑您的用例并确定哪个函数满足这些特定标准——如果没有这样的内置函数令人满意,则需要自定义函数。 (2认同)