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.
