誰もが知っているように、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プラグインは、これまで見た他のどのプラグインよりも(プラグインユーザーの観点から)非常に単純です。これが以前に行われていない理由がわかりません。
私もこれに不満を感じ、「ts-type-checked」と呼ばれる自分のタイプガードジェネレーターを NPMモジュール として使用できるようになりました。これは、タイプに基づいてタイプガードを生成するTypeScript変換です。