javascript - TypeScript isNaN prihvaća samo broj


Radim s WebStorm 2016.2.2, TypeScript 2.1, Node.js.

Iz nekog razloga, isNaN je deklarirana kao funkcija koja prihvaća samo broj:

declare function isNaN(number: number): boolean;

Pokušao sam to promijeniti na bilo što, ali izgleda da to ne utječe na TSC. I dalje dobivam istu pogrešku:

Argument tipa 'string' ne može se dodijeliti parametru tipa 'number'

Moj kod (pojednostavljeno):

isNaN("10");

Kako to mogu riješiti/zaobići?


Uredi:

Primijetite da prema specifikaciji, parametar funkcije isNaN može biti bilo koje vrste: Number.isNaN()

Također: Moj je kod pojednostavljen. Zapravo primam parametar koji može biti ili niz ili broj, i ako je niz, može biti ili niz koji predstavlja broj koji bih želio pretvoriti u broj ("10") ili jednostavan niz ("Hello world").

Nisam htio/htjela produžiti ovo pitanje uključivanjem cijelog svog koda, ali budući da je izazvalo zabunu, ovo je moj stvarni kod:

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

Odgovor #1

Savjetujem vam da svoj kod implementirate drugačije.
Razlozi:

  1. Može biti kratko, ali nije lako razumjeti što se događa
  2. Korištenje isNaN ovdje nije najbolja opcija: isNaN("") također vraća false

Bolje da pokušate pretvoriti vrijednost u broj i provjerite je li to NaN ili nije (kao što je @smnbbrv napisao):

if (typeof expectedValue === "string" && !Number.isNaN(Number(expectedValue))) {
    expectedValue = Number(expectedValue);
}

Uredi

Svoju vrijednost možete proslijediti kao any:

isNaN(ctualValue as any)

Zaobilaziti provjeru kompajlera.

Odgovor #2

Ne bi to trebao rješavati jer TypeScript tako radi.

Samo prvo pretvori unos u broj

Number("10") // 10
Number("abc") // NaN

a zatim provjerite rezultat funkcijom isNan:

isNaN(Number("abc"))

Povezani članci