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
