web-dev-qa-db-fra.com

Définir une liste de clés facultatives pour l'enregistrement TypeScript

Je veux taper un objet qui ne peut avoir que les touches 'a', 'b' ou 'c'.

Je peux donc le faire comme suit:

Interface IList {
    a?: string;
    b?: string;
    c?: string;
}

Ils sont tous facultatifs! Maintenant, je me demandais si cela pouvait être écrit avec Record sur une seule ligne

type List = Record<'a' | 'b' | 'c', string>;

Le seul problème est que toutes les clés doivent être définies. Je me suis donc retrouvé avec

type List = Partial<Record<'a' | 'b' | 'c', string>>;

Cela fonctionne, mais je peux imaginer qu'il existe une meilleure façon de procéder sans Partial. Existe-t-il un autre moyen de rendre les clés facultatives dans Record?

12
Jeanluca Scaljeri

Il n'y a aucun moyen de spécifier le caractère facultatif des membres de Record. Ils sont requis par définition

type Record<K extends keyof any, T> = {
    [P in K]: T; // Mapped properties are not optional, and it's not a homomorphic mapped type so it can't come from anywhere else.
};

Vous pouvez définir votre propre type s'il s'agit d'un scénario courant pour vous:

type PartialRecord<K extends keyof any, T> = {
  [P in K]?: T;
};
type List =  PartialRecord<'a' | 'b' | 'c', string>

Ou vous pouvez également définir PartialRecord en utilisant les types mappés prédéfinis:

type PartialRecord<K extends keyof any, T> =  Partial<Record<K, T>>

Vous pouvez créer la version partielle de votre type List:

type PartialList = Partial<List>;

Et vous pouvez tout faire sur une seule ligne si vous ne voulez pas le type intermédiaire:

type PartialList = Partial<Record<'a' | 'b' | 'c', string>>;

Vous pourriez décider qu'en fin de compte, le plus expressif pour votre futur est:

type List = {
    a?: string;
    b?: string;
    c?: string;
}
3
Fenton