众所周知,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));
有人设法建立了这样的东西吗?
我肯定会使用运行时检查,如果有一些我不控制的外部API,它们发生了很多变化并且没有更新的文档。
现在,我很好奇它如何检查对象数组?它是否遍历每个元素,并确保对象是否像您的示例一样具有所有初始化的属性?想象其中还有另一个对象数组。可以做到多深?那开销呢?
Typescript的instanceof
type guard检查构造函数,但我认为它也不检查所有键。不过,在大多数情况下,这应该足够了。
使用外部API,可以使用instanceof
包进行更详细的验证,如果要将普通对象(例如,从JSON解析的对象)转换为类,则可以使用class-validator。