TypeScript isNan只接受一个数字

时间:2017-02-08 17:41:20

标签: javascript node.js typescript webstorm

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

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

declare function isNaN(number: number): boolean;

我试图将其更改为任何,但看起来它对TSC没有影响。我仍然得到同样的错误:

  

类型'字符串'的参数不能分配给类型的参数   '数'

我的代码(简化):

isNan("10");

我该如何解决/解决它?

修改

请注意,根据规范,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;
            }

7 个答案:

答案 0 :(得分:21)

我建议您以不同方式实施您的代码 原因:

  1. 可能很短,但不容易理解发生了什么
  2. 使用isNaN不是最佳选择:isNaN("")还会返回false
  3. 您最好尝试将值转换为数字,然后检查是否NaN(如@smnbbrv所写):

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

    修改

    您可以将您的值传递为any

    isNaN(ctualValue as any)
    

    绕过编译器检查。

答案 1 :(得分:8)

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

只需将输入转换为数字

Number("10") // 10
Number("abc") // NaN

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

isNaN(Number("abc"))

答案 2 :(得分:2)

具有讽刺意味的是,数字只能是NaN,因此您需要先将字符串转换为数字。

一元加号运算符是一种非常简单的方法。

因此,您可以做一个简单的isNaN(+"10")

请记住,诸如+""+" "+"\n"之类的数字为0!

答案 3 :(得分:1)

您可以通过在isNaN中使用parseInt解决此问题。如果parseInt返回NaN,则isNaN检查仍然有效。这样您的Typescript错误就会得到解决。

if (typeof actualValue === "string" && !isNaN(parseInt(actualValue, 10))) {
  actualValue = +actualValue;
}

答案 4 :(得分:0)

答案 5 :(得分:0)

首先,只有number类型的值可以是NaN。因此,如果静态上下文告诉您值的类型为string,则可以确定它不是NaN。如果您的类型为string|number(应该避免使用btw),您仍然可以决定如何处理此问题。严格地说,字符串值"foo"不是NaN,因为NaN是IEEE标准中为浮点数指定的特定值。但是,在javascript中,isNaN("foo")将是真的,首先是函数will coerect the string to a number,并且该系数会产生NaN。 Typescript试图利用这里的类型,它试图阻止你在不应该使用的地方使用isNaN

答案 6 :(得分:0)

在接受的答案中,!Number.isNaN(Number(expectedValue)) 仍然为空字符串 ('') 和空白字符串 (' ') 返回 true。并将这些转换为数字将导致 0

我不是 JavaScript 开发人员,而且——尤其是来自 .Net——在我看来也很疯狂,但这是我所做的似乎有效的工作:

private static isNumber(value: any): boolean {
  return (typeof value === 'number' && !isNaN(value))
      || ((typeof value === 'string') && value.trim() != '' && !isNaN(Number(value)))
  }

如果您知道更明智的解决方案,请务必编辑它!

console.log(isNumber([]));      // false
console.log(isNumber({}));      // false
console.log(isNumber(""));      // false
console.log(isNumber("   "));   // false
console.log(isNumber(" 1  "));  // true <= note
console.log(isNumber(" 1  2")); // false
console.log(isNumber("1"));     // true
console.log(isNumber(1));       // true