typescript - Hva er galt med typeof a == "array"?


Prøv på lekeplassen:

typeof a == "array"

vil resultere i

Operatoren '==' kan ikke brukes på typer '"string" | "number" | "symbol" | "object" | "function"' og '"array"'.)

Ikke bare gir ikke denne feilmeldingen mening for meg (typeof a == "object" er helt greit), det ser også ut til å være en nylig endring. Du må nå bruke a instanceof Array, noe som ikke var nødvendig sist jeg sjekket. Kan du vennligst forklare dette for meg?

Svar #1

Som påpekt av SLaks, kan aldri typeof-operatoren returnere "array". https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof

Det har aldri fungert, men TypeScript ble først smart nok til å advare deg om det i 2.0.

Svar #2

Her er et fullt fungerende eksempel for deg:

var a: string | string[];

// You need this in the example to ensure the compiler won't determine that a
// is never a string if you set it to an array...
if (new Date().getDay() > 3) {
    a = 'a string';
} else {
    a = [
        'an',
        'array'
    ];
}

if (Array.isArray(a)) {
    var example1 = a; // example1: string[]
} else {
    var example2 = a; // example2: string
}

Den midterste kodeblokken er kun nødvendig for demonstrasjonsformål, hvis du starter dette eksemplet med var a: string | string[]=[] vil variabelen example2 faktisk ende opp med å være av typen never fordi kompilatoren er smart nok til å se at det ikke finnes noen situasjon der a-variabelen vil bli satt til noe annet enn en array.