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

问题描述 投票:3回答:1

众所周知,TypeScript仅在编译时进行类型检查。

有两种添加运行时检查的现有方法,但我想知道是否有更简单的方法。

例如一个可以翻译的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));

有人设法建立了这样的东西吗?

javascript node.js typescript babel typescript2.0
1个回答
0
投票

我肯定会使用运行时检查,如果有一些我不控制的外部API,它们发生了很多变化并且没有更新的文档。

现在,我很好奇它如何检查对象数组?它是否遍历每个元素,并确保对象是否像您的示例一样具有所有初始化的属性?想象其中还有另一个对象数组。可以做到多深?那开销呢?


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.