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?
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;
}