Kontrollera om variabeln tillhör en anpassad typ i Typescript med samma egenskaper


Det finns följande typer:

type TypeA = {
  desc: string;
  name: string;
}

type TypeB = {
  desc: string;
  name: string;
  age: number;
}

type TypeC = {
  desc: string;
  name: string;
  age: number;  
  gender: string;  
}

type TypeAll = TypeA | TypeB | TypeC;

Jag sökte efter lösningen och jag upptäckte att Typeguards är det mest eleganta sättet att kontrollera anpassade typer. MEN i alla exempel filtrerar de efter en uttrycklig egenskap hos den typen. Som:

isTypeC(type: TypeAll):type is TypeC {
  return type.gender !== undefined
}    

Hur skriver man det för TypeA eller TypeB? Dessutom kan det hända att typerna ändras över tid (inte vid körning!) och detta behöver en lösning som inte kontrollerar explicita egenskaper. Är det möjligt?

Svar #1

Vid körning har du endast det "råa" JSON-objektet. Därför har du inget annat sätt att fastställa dess typ än att kontrollera nyttolasten. Vanligtvis skulle man använda någon form av "taggning"-egenskap för att säkert särskilja dessa olika typer och undvika förvirring vid typer med överlappande egenskaper:

type TypeA = {
  type: "A";
  desc: string;
  name: string;
}

type TypeB = {
  type: "B";
  desc: string;
  name: string;
  age: number;
}

type TypeC = {
  type: "B";
  desc: string;
  name: string;
  age: number;  
  gender: string;  
}

type TypeAll = TypeA | TypeB | TypeC;

Denna designmönster kallas "Discriminated Unions", Typescript-handboken dokumenterar den avsedda användningen.

Relaterade artiklar