typescript - Hvordan raskt skille mellom grensesnitt med ikke-overlappende egenskaper


I TypeScript har jeg ofte en variabel med en type som:

const variable: { a: string } | { b: number };

Når jeg vil sjekke hvilken form variabelen har, vil jeg vanligvis gjøre

if (variable.a !== undefined) {
  // do stuff
}
else {
  // do stuff

Men i streng modus, kaster TypeScript en typefeil på variable.a fordi variable ikke er kjent for å ha egenskapen a. For å komme rundt dette, pleier jeg vanligvis å caste til any som (variable as any).a !== undefined. Men TypeScript behandler ikke dette som en typebeskytter og indikerer ikke typen til variable.

Finnes det en "riktig" måte å gjøre denne sjekken på i TypeScript når man er i streng modus (uten å lage en egendefinert type-guard)?

Noen eksempler jeg har prøvd (som dessverre også gir typefeil):

  • typeof variable.a !== 'undefined'
  • variable.hasOwnProperty('a')

Svar #1

Den enkleste måten å diskriminere i dette tilfellet ville være en in-typebeskyttelse:

declare const variable: { a: string } | { b: number };


if ('a' in variable) {
    variable.a
}
else {
    variable.b
}