我使用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;
}
答案 0 :(得分:21)
我建议您以不同方式实施您的代码 原因:
isNaN
不是最佳选择:isNaN("")
还会返回false
您最好尝试将值转换为数字,然后检查是否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)
您可以使用全局范围函数isFinite()
...不要使用Number.isFinite()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite
答案 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