Javascript TypeScript isNan只接受一个数字
我使用WebStorm 2016.2.2、TypeScript 2.1、Node.js 出于某种原因,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的参数可以是任何类型: 另外:我的代码被简化了。
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