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:
- Može biti kratko, ali nije lako razumjeti što se događa
- Korištenje
isNaNovdje nije najbolja opcija:isNaN("")također vraćafalse
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"))
