Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript TypeScript isNan只接受一个数字_Javascript_Node.js_Typescript_Webstorm - Fatal编程技术网

Javascript TypeScript isNan只接受一个数字

Javascript TypeScript isNan只接受一个数字,javascript,node.js,typescript,webstorm,Javascript,Node.js,Typescript,Webstorm,我使用WebStorm 2016.2.2、TypeScript 2.1、Node.js 出于某种原因,isNan被声明为只接受数字的函数: declare function isNaN(number: number): boolean; 我试着把它改成any,但看起来对TSC没有影响。我仍然得到相同的错误: 类型为“string”的参数不能分配给类型为的参数 “数字” 我的代码(简化): 我如何解决/解决它 编辑: 请注意,根据规范,isNan的参数可以是任何类型: 另外:我的代码被简化了。

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

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

declare function isNaN(number: number): boolean;
我试着把它改成any,但看起来对TSC没有影响。我仍然得到相同的错误:

类型为“string”的参数不能分配给类型为的参数 “数字”

我的代码(简化):

我如何解决/解决它


编辑:

请注意,根据规范,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;
            }
if(typeof expectedValue==“string”&&&!isNaN(expectedValue)){
expectedValue=+expectedValue;
}
if(实际值的类型==“字符串”&&&&!isNaN(ctualValue)){
实际价值=+实际价值;
}
开关(本操作员){
case Operator.equal:
返回actualValue==expectedValue;
case Operator.notEqual:
返回actualValue==未定义| | actualValue!=期望值;
case Operator.greaterThan:
返回实际值>期望值;
case Operator.littleThan:
返回实际值<期望值;
case Operator.greaterequal:
返回actualValue>=expectedValue;
case Operator.littleequal:

返回actualValue您不应该求解它,因为JavaScript就是这样工作的

只需先将输入转换为number

Number("10") // 10
Number("abc") // NaN
然后使用isNan函数检查结果:

isNaN(Number("abc"))

首先,只有
number
类型的值才能是
NaN
。因此,如果静态上下文告诉您您的值是
string
类型,您可以确保它不是
NaN
。如果您的值是
string | number
(顺便说一句,应该避免)您仍然可以决定如何处理此问题。严格来说,字符串值
“foo”
不是
NaN
,因为
NaN
是IEEE标准中为浮点数指定的特定值。但在javascript中,
isNaN(“foo”)
将是正确的,因为函数是第一位的,并且共同定向会产生一个
NaN
。Typescript试图利用这里的类型,它试图阻止您在不应该使用的地方使用
isNaN

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

  • 它可能很短,但不容易理解发生了什么
  • 在这里使用
    isNaN
    不是最好的选择:
    isNaN(“”
    也返回
    false
  • 您最好尝试将该值转换为一个数字,并检查该值是否为
    NaN
    (如@smnbbrv所述):


    编辑 您可以将值作为
    任意
    传递:

    isNaN(ctualValue as any)
    

    绕过编译器检查。

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

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

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

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

    所以你可以做一个简单的
    isNaN(+“10”)


    请记住,
    +”
    +”
    +“\n”
    等都是0!

    在公认的答案中,
    !Number.isNaN(Number(expectedValue))
    仍然会为空字符串(
    '
    )和空白字符串(
    '
    )返回true。将它们转换为Number将导致
    0

    我不是一名JavaScript开发人员,尤其是来自.Net的开发人员,我觉得它也很疯狂,但这就是我所做的工作:

    private static isNumber(值:any):布尔值{
    返回值(typeof value==='number'&&&!isNaN(value))
    ||((typeof value==='string')&&value.trim()!='&&&!isNaN(数字(值)))
    }
    
    如果你知道一个更明智的解决方案,一定要编辑这个

    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
    
    console.log(isNumber([]);//false
    console.log(isNumber({}));//false
    console.log(isNumber(“”);//false
    console.log(isNumber(“”);//false
    
    console.log(isNumber(“1”);//true(1)为什么需要检查字符串是否不是数字?很明显它不是。(2)您是如何尝试更改它的?您通常会将表达式传递给
    isNaN()
    要查看表达式是否会产生数字。传递文本有点不必要,你不认为吗?@NitzanTomer我没有真正检查文本是否为Nan,我简化了我的代码。无论如何,根据规范,isNan应该接受任何类型。@ScottMarcus我没有真正检查文本是否为Nan,我简化了我的代码。有吗way isNan应该根据规范接受任何类型。但是如果您使用的是typescript,那么您如何发现自己处于这样一种情况:您只传递了
    数字
    任何
    ?通常建议避免使用
    数字()
    字符串()
    布尔()
    函数。可能最好使用
    parseInt()
    parseFloat()
    @ScottMarcus您可能正在谈论的
    newnumber()
    通常应该避免(因为它们创建对象而不是创建文字),如果我没记错的话,在ES6中不推荐使用;但是
    Number()
    没有任何问题。如果有,请澄清。请澄清为什么它不好。我经常使用它
    if (typeof actualValue === "string" && !isNaN(parseInt(actualValue, 10))) {
      actualValue = +actualValue;
    }
    
    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