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 插件比我目前看到的任何其他插件都简单得多(从插件用户的角度来看)。我不确定为什么以前没有这样做。
Max*_*kov -3
Typescript 的instanceof类型保护会检查构造函数,但我认为它不会检查所有键。不过,在大多数情况下,这应该足够了。
使用外部 API,您可以使用class-validator包进行更详细的验证,如果您想将普通对象(例如,从 JSON 解析)转换为您的类,则可以使用 class-transformer -validator 。
| 归档时间: |
|
| 查看次数: |
2176 次 |
| 最近记录: |