web-dev-qa-db-fra.com

Vérification de type Script et runtime, solution simple en 2020

Comme nous le savons tous, TypeScript ne vérifie le type qu'au moment de la compilation.

Il existe quelques approches existantes pour ajouter des vérifications d'exécution, telles que io-ts , mais je me demande s'il existe un moyen plus simple.

Par exemple un plugin Babel qui transpilerait ceci:

type Todo = {
  userId: number;
  id: number;
  title: string;
  completed: boolean;
}

const resp = await fetch("https://jsonplaceholder.typicode.com/todos/1");

const data = await resp.json();

assert(data typeof Todo);

pour que:

const __TodoType = {
  userId: Number;
  id: Number;
  title: String;
  completed: Boolean;
};
const __isTodoType = obj => (
  obj &&
  obj.constructor === Object &&
  Object.keys(obj).length === Object.keys(__TodoType).length &&
  Object.entries(obj)
    .every(([prop, val]) =>
      __TodoType[prop] && val &&
      __TodoType[prop] === val.constructor)
);

const resp = await fetch("https://jsonplaceholder.typicode.com/todos/1");

const data = await resp.json();

assert(__isTodoType(data));

Ce serait une solution super simple et couvrirait de nombreux cas d'utilisation (sinon la plupart). AFAICT, ce serait suffisant pour affirmer la sérialisation/la récupération de données.

Quelqu'un a-t-il réussi à créer un tel plugin Babel?

Edit - Je connais les bibliothèques existantes telles que io-ts mais je recherche quelque chose de beaucoup plus simple. Le plugin Babel que je présente est beaucoup plus simple (du point de vue de l'utilisateur du plugin) que tout ce que j'ai vu jusqu'à présent. Je ne sais pas pourquoi cela n'a pas été fait auparavant.

13
brillout

J'étais également frustré par cela et j'ai fini par écrire mon propre générateur de garde de type appelé ‛ts-type-checked‛ disponible sous forme de module NPM . Il s'agit d'une transformation TypeScript qui génère des protections de type en fonction de vos types.

1