Envoyé par
Taro
J'avoue, l'intérêt de définir l'indexation d'un tableau par des entiers de 5 à 8 par exemple, on peut parfois le chercher... ça paraît inutile et contre-intuitif.
Ce qu'il faut y voir, par contre, c'est que ça marche sur des types plus variés que les "simples" entiers de base.
Et donc, par exemple, tu pourrais très bien définir un tableau contenant des entiers, indexé via le type Temperature, et qui te servirait à stocker pour chaque valeur la conversion en degrés Fahrenheit.
Ou avoir un type enum Color qui peut prendre les valeurs Red/Green/Blue et t'en servir pour indexer un type array Pixel.
Tout en ayant les contraintes du typage fort (nécessité de passer par des casts explicites en cas de conversion, détection au runtime des valeurs non autorisées).
Ah oui effectivement ça peut être très utile dans ces cas.
Y'a un truc similaire en Typescript avec les types mappés où tu peux définir les propriétés acceptées/obligatoires pour un objet.
Si je reprend ton exemple du pixel tu peux faire :
Code:
// Pas obligé d'assigner des valeurs explicites à l'enum mais plus pratique pour déclarer les objets et accéder à leurs propriétés
enum Colors {
Red = 'red',
Green = 'green',
Blue = 'blue'
}
// Pas de range en TS malheureusement pour l'instant, donc déclarer les valeurs de 0 à 255 est plutôt moche
type ColorValue = 0 | 1 | 2 | 4
// Record<K, V> est un type générique de base qui accepte les types de propriétés (K) et des valeurs (V) de l'objet
type Pixel = Record<Colors, ColorValue>
const a: Pixel = {
[Colors.Red]: 0,
[Colors.Green]: 0,
[Colors.Blue]: 0,
} // OK
const b: Pixel = {
red: 0,
green: 0,
blue: 0,
} // OK
const c: Pixel = {
red: 5,
green: 0,
blue: 0,
} // Error
const d: Pixel = {
red: 0,
blue: 0,
} // Error
const e: Pixel = {
red: '0',
green: '0',
blue: '0',
} // Error
const f: Partial<Pixel> = {
red: 0,
} // OK
const test1 = 5
const test2: number = 4
const test3 = 4
const test4: ColorValue = 4
a.red = test1 // Error
a.red = test2 // Error
a.red = test3 // OK
a.red = test4 // OK
a[Colors.red] = test4 // OK
a['red'] = test4 // OK
Bien sur ça reste du check à la compilation pas au runtime (JS interprété oblige), mais c'est très utile.