Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeScript isNan only accepts a number

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;             } 
like image 744
Alon Avatar asked Feb 08 '17 17:02

Alon


People also ask

What does isNaN returns if value is Not a Number?

isNaN() returns true if a number is Not-a-Number. In other words: isNaN() converts the value to a number before testing it.

How do I check if a value is NaN in TypeScript?

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 .

What is the difference between isNaN and number isNaN?

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 .

Is Not a Number TypeScript?

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.


2 Answers

I advise you to implement your code differently.
The reasons:

  1. It might be short, but it's not easy to understand what's going on
  2. Using isNaN isn't the best option here: isNaN("") returns false as well

You 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); } 

Edit

You can pass your value as any:

isNaN(ctualValue as any) 

To bypass the compiler check.

like image 131
Nitzan Tomer Avatar answered Oct 04 '22 13:10

Nitzan Tomer


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")) 
like image 41
smnbbrv Avatar answered Oct 04 '22 13:10

smnbbrv