web-dev-qa-db-ja.com

TypeScriptとランタイム型チェック、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-tsなどの既存のライブラリを知っていますが、もっと簡単なものを探しています。私が紹介しているBabelプラグインは、これまで見た他のどのプラグインよりも(プラグインユーザーの観点から)非常に単純です。これが以前に行われていない理由がわかりません。

13
brillout

私もこれに不満を感じ、「ts-type-checked」と呼ばれる自分のタイプガードジェネレーターを NPMモジュール として使用できるようになりました。これは、タイプに基づいてタイプガードを生成するTypeScript変換です。

1