TypeScript 和运行时类型检查,2020 年的简单解决方案

bri*_*out 17 javascript node.js typescript babeljs typescript2.0

众所周知,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);
Run Code Online (Sandbox Code Playgroud)

对此:

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));
Run Code Online (Sandbox Code Playgroud)

这将是一个超级简单的解决方案,将涵盖许多(如果不是大多数)用例。AFAICT,这足以断言序列化/数据获取。

有人设法构建了这样的 Babel 插件吗?

编辑- 我知道现有的库,例如 io-ts,但我正在寻找更简单的东西。我展示的 Babel 插件比我目前看到的任何其他插件都简单得多(从插件用户的角度来看)。我不确定为什么以前没有这样做。

Ján*_*šta 6

我也对此感到沮丧,并最终编写了我自己的类型保护生成器,称为 ?ts-type-checked? 可作为NPM 模块使用。它是一种 TypeScript 转换,可根据您的类型生成类型保护。


Max*_*kov -3

Typescript 的instanceof类型保护会检查构造函数,但我认为它不会检查所有键。不过,在大多数情况下,这应该足够了。

使用外部 API,您可以使用class-validator包进行更详细的验证,如果您想将普通对象(例如,从 JSON 解析)转换为您的类,则可以使用 class-transformer -validator 。