I work with WebStorm 2016.2.2, TypeScript 2.1, Node.js.
For some reason, isNan
is declared as a function that only accepts a number:
declare function isNaN(number: number): boolean;
I tried to change it to any, but it looks like it doesn't influence on the TSC. I still get the same error:
Argument of type 'string' is not assignable to parameter of type 'number'
My code (simplified):
isNan("10");
How can I solve/workaround it?
Edit:
Notice that according to specification, isNan's parameter can be any type: Number.isNan()
Also: My code was simplified. I actually receive a parameter that may be either a string or a number, and if it's a string it may be either a stringy number that I would like to convert to number ("10") or a simple string ("Hello world").
I didn't want to make this question long by including my entire code, but because it caused confusion, this is my real code:
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; }
isNaN() returns true if a number is Not-a-Number. In other words: isNaN() converts the value to a number before testing it.
To check if a value is NaN , call the Number. isNaN() method, passing it the value as a parameter. The Number. isNaN method returns true if the passed in value is NaN and has a type of number , otherwise it returns false .
isNaN converts the argument to a Number and returns true if the resulting value is NaN . Number. isNaN does not convert the argument; it returns true when the argument is a Number and is NaN .
NaN in Typescript stands for Not a Number. It is the result of numerical operations, where result is not a number . It is the property of the global object. You can refer it either as NaN or Number.
I advise you to implement your code differently.
The reasons:
isNaN
isn't the best option here: isNaN("")
returns false
as wellYou better try to convert the value into a number and check if that's NaN
or not (as @smnbbrv wrote):
if (typeof expectedValue === "string" && !Number.isNaN(Number(expectedValue))) { expectedValue = Number(expectedValue); }
You can pass your value as any
:
isNaN(ctualValue as any)
To bypass the compiler check.
You should not solve it because this is how JavaScript works.
Just cast the input to number first
Number("10") // 10 Number("abc") // NaN
and then check the result with the isNan function:
isNaN(Number("abc"))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With