TypeScript и проверка типов во время выполнения, простое решение в 2020 году - PullRequest
12 голосов
/ 03 мая 2020

Как мы все знаем, проверки типов TypeScript только во время компиляции.

Существует несколько существующих подходов для добавления проверок во время выполнения, таких как io-ts , но я ' Мне осталось только подумать, есть ли более простой способ.

Например, плагин Babel, который передал бы это:

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);

на это:

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));

Это было бы будет очень простым решением и будет охватывать многие (если не большинство) варианты использования. AFAICT, этого было бы достаточно для утверждения сериализации / выборки данных.

Кто-то сумел создать такой плагин Babel?

Edit - Я знаю существующие библиотеки, такие как io но я ищу что-то гораздо более простое. Плагин Babel, который я демонстрирую, намного проще (с точки зрения пользователя плагина), чем все остальное, что я видел до сих пор. Я не уверен, почему это не было сделано раньше.

Ответы [ 4 ]

0 голосов
/ 12 мая 2020

Я не знаю ни одного крутого инструмента, который бы делал это автоматически, но я могу рассказать вам, что я использую для проверки типов во время выполнения: AJV - https://github.com/ajv-validator/ajv

Это не идеально, потому что вам нужно сгенерировать json схемы для каждого типа, но вы можете автоматизировать это с помощью машинописи- json -schema (https://github.com/YousefED/typescript-json-schema#readme)

Надеюсь, это поможет!

0 голосов
/ 03 мая 2020

Я использую IO-TS . Вам нужно написать один раз для проверки типа и времени выполнения.

0 голосов
/ 11 мая 2020

Дайте typcript-runtime-types попробовать. Я не знаю, как или если это работает с Babel, но есть небольшой раздел об использовании его с Webpack и awesome-typescript-loader. Я думаю, что он делает то, что вы ищете, хотя единственные примеры, которые он показывает, это с интерфейсами, что может означать, что вам не разрешено вложить типы или использовать & или | или Pick или другие аннотации сложных типов , Если это правда, вам просто нужно использовать io-ts.

0 голосов
/ 03 мая 2020

Typescript's instanceof type guard проверяет функцию конструктора, но я не думаю, что она проверяет также и все ключи. Тем не менее, в большинстве случаев этого должно быть достаточно.

Работая с внешним API, вы можете использовать пакет class-validator для более подробной проверки и class-transformer-validator если вы хотите преобразовать простые объекты (например, проанализированные с JSON) в ваши классы.

...