Dans cet article de blog, nous utilisons TypeScript pour nous assurer qu'un objet reste synchronisé avec un tableau qui répertorie ses propriétés.
Le problème #
Considérez le code TypeScript suivant :
interface Person {
first: string;
last: string;
}
const personKeys = [
'first',
'last',
] as const;
personKeys
liste les clés de propriété de Person
. Pouvons-nous vérifier au moment de la compilation si cette liste est correcte ?
La solution #
import {assert as tsafeAssert, Equals} from 'tsafe';
tsafeAssert<Equals<
keyof Person,
(typeof personKeys)[number]
>>();
Bibliothèque tsafe
permet de vérifier si deux types sont égaux.
Les arguments de Equals<>
sont calculés comme suit :
// %inferred-type: "first" | "last"
type A = keyof Person;
// %inferred-type: readonly ["first", "last"]
type B = typeof personKeys;
// %inferred-type: "first" | "last"
type C = B[number];
Pour calculer tapez C
, nous utilisons l'opérateur d'accès indexé T[K]
:Pour un type donné T
, il calcule les types de toutes les propriétés dont les clés sont assignables au type K
. Les deux types suivants sont à peu près équivalents. Cela explique le résultat du calcul de B[number]
.
type T = ["first", "last"];
type U = {
0: "first",
1: "last",
};
Autres lectures #
- Section "L'opérateur d'accès indexé
T[K]
” dans "Tackling TypeScript"