typescript - objektet kan muligens være `null` når typen er `A | undefined` og vi vet at det ikke kan være `undefined`


Fra og med versjon 4.8.4 klager TypeScript-kompilatoren på følgende kode:

type A = {v: number}

function get_the_first<T>(xs: T[]): T | undefined {
    if (xs.length > 1)
        return xs[0];
    else
        return undefined
}

function foo<T>(xs: T[], fielddb: keyof T) {

    let a: T | undefined = get_the_first(xs);

    if (a === undefined) {

    } else {
        console.log(a[fielddb]); // Error: Object is possibly 'null'  
    }

}

foo([{v: 42}], 'v')

Lekeplass

Jeg skjønner ikke hvorfor jeg får denne meldingen, variabelen a er enten T eller undefined, og vi har allerede fastslått at den ikke kan være undefined.

Med mindre kompilatoren mener at den generiske typen T kan være typen null. Hvis ja, hvordan håndtere denne advarselen?

Svar #1

Generisk parameter T har ingen begrensninger, så det kan være hva som helst, noe som i utgangspunktet kan representeres som:

type T = {} | null | undefined

Du har fjernet undefined, men ikke null. Det er det TypeScript sier.

I stedet kan du endre betingelsen til:

if (a == null) {

… som (hvis du er strengt imot ==-operatoren) er helt lik:

if (a === null || a === undefined) {

Prøv det.

Svar #2

Ja, du har rett i at kompilatoren ser at hvis T inkluderer null, så kan a potensielt være null siden du bare sjekker for undefined. Men det er en enkel fikse; bare sjekk for null også:

if (a === undefined || a === null) {

} else {
    console.log(a[fielddb]);
}

Noen mennesker liker å forkorte dette til

if (a == null) {

Men jeg liker å holde det eksplisitt og ikke stole på JavaScripts uforutsigbare oppførsel.

Se jcalz sitt svar her: Sjekke en valgfri generisk parameter for udefinerte resultater resulterer i T & ({} | null)

Lekeplass

Relaterte artikler