TypeScript :vérification au moment de la compilation si un tableau répertorie toutes les clés de propriété

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"