25 votes

Pourquoi le type de `keyof any` est `string | number | symbol` dans le typecript ?

Le type Record en typographie est défini comme suit :

type Record<K extends keyof any, T> = {
    [P in K]: T;
}

Je ne comprends pas pourquoi keyof any est utilisé ici.

Après vérification, j'ai constaté que le type de keyof any es string | number | symbol . Pourquoi ?

32voto

devilmaster Points 439

keyof any représente le type de toute valeur qui peut être utilisée comme index d'un objet. Actuellement, vous pouvez utiliser string o number o symbol pour indexer un objet.

let a: any;
a['a'] //ok
a[0] // ok
a[Symbol()] //ok
a[{}] // error

Dans le Record type, ce K extends keyof any est utilisé pour contraindre K à quelque chose qui est une clé valide pour un objet. Ainsi, K pourrait être 'prop' o '1' o string mais pas {a : string} :

type t0 = Record<1, string> // { 1: string }
type t1 = Record<"prop", string> // { prop: string }
type t3 = Record<string, string> // { [name: string]: string }
type t4 = Record<number, string> // { [name: number]: string }
type t5 = Record<{a : string}, string> // error

La contrainte est là, puisque quel que soit le type passé dans le fichier K deviendront les clés du type résultant, et donc K doit être quelque chose qui est une clé valide pour un objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X