typescript - Hur använder man en indexerad åtkomsttyp för barn till en valfri egenskap?


Säg att jag har en typ som:

type Person = {
  firstName: string;
  lastName: string;
  contact: {
    type: string;
    value: string;
  }[];
};

Om jag vill ha typen av ett element i contact-arrayen kan jag använda en indexerad åtkomsttyp som:

type Contact = User['contact'][number];

// same as type Contact = { type: string; value: string };

I huvudsak, "typen vid ett numeriskt index i contacts-arrayen", och det skulle också fungera för ett inbäddat objekt.

Men om det är en valfri parameter såsom:

type Person = {
  firstName: string;
  lastName: string;
  contact?: {
    type: string;
    value: string;
  }[];
};

Detta rapporterar (giltigt) ett fel på:

Type '{ type: string; value: string; }[] | undefined' has no matching index signature for type 'number'.ts(2537)

Hur kan jag "nullkontrollera" inom typaliaset för att få en nästlad typ?

Svar #1

Uppdatering

NonNullable<T> tar bort undefined och null från dess typparameter.

type Contact = NonNullable<User['contact']> // almost the same as the next type, but also excludes `null` from the union.
type Contact = Exclude<User['contact'], undefined>[number];

https://www.typescriptlang.org/docs/handbook/utility-types.html#nonnullabletype

Äldre svar

Du kan Exclude typer när du behöver borra ner mer.

type Contact = Exclude<User['contact'], undefined>[number];

Dokumentationen är inte särskilt stabil kring ämnet, men https://www.typescriptlang.org/docs/handbook/utility-types.html är den aktuella länken.

Relaterade artiklar