Javascript 打字稿&;运行时类型检查,2020年的简单解决方案

Javascript 打字稿&;运行时类型检查,2020年的简单解决方案,javascript,node.js,typescript,babeljs,typescript2.0,Javascript,Node.js,Typescript,Babeljs,Typescript2.0,众所周知,TypeScript类型只在编译时进行检查 有两种现有的方法可以添加运行时检查,例如,但我想知道是否有更简单的方法 例如,一个Babel插件可以传输: 类型Todo={ userId:number; id:编号; 标题:字符串; 完成:布尔; } const resp=等待获取(“https://jsonplaceholder.typicode.com/todos/1"); const data=wait resp.json(); 断言(Todo的数据类型); 为此: const\u

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

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

例如,一个Babel插件可以传输:

类型Todo={
userId:number;
id:编号;
标题:字符串;
完成:布尔;
}
const resp=等待获取(“https://jsonplaceholder.typicode.com/todos/1");
const data=wait resp.json();
断言(Todo的数据类型);
为此:

const\uuu TodoType={
userId:Number;
id:编号;
标题:字符串;
完成:布尔;
};
const\uu isTodoType=obj=>(
obj&&
obj.constructor==对象&&
Object.keys(obj).length==Object.keys(\uu TodoType).length&&
Object.entries(obj)
.每([prop,val])=>
__TodoType[prop]&&val&&
__TodoType[prop]==val.constructor)
);
const resp=等待获取(“https://jsonplaceholder.typicode.com/todos/1");
const data=wait resp.json();
断言(uu isTodoType(数据));
这将是一个超级简单的解决方案,将涵盖许多(如果不是大多数的话)用例。在AFAICT中,这对于断言序列化/数据获取就足够了

有人成功地构建了这样的巴别塔插件吗

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

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


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

我正在使用。只需编写一次即可进行类型和运行时检查。

试试看。我不知道Babel是如何使用它的,也不知道它是否可以使用,但是有一小部分是关于如何将它与Webpack和很棒的typescript loader一起使用的。我认为它满足了您的需求,尽管它显示的唯一示例是接口,这可能意味着您不允许嵌套类型或使用
&
|
拾取
或其他复杂类型注释。如果这是真的,您只需要使用io-ts。

我不知道有什么很酷的工具可以自动完成这项工作,但我可以告诉您我在运行时使用什么来验证类型:AJV-

这并不理想,因为您需要为每种类型生成json模式,但您可以使用typescript json模式()自动生成json模式


希望这有帮助

我也为此感到沮丧,最后编写了我自己的类型保护生成器,名为“ts type checked”,可作为。它是一种类型脚本转换,根据您的类型生成类型保护。

TySheMo

javascript运行时数据类型检查系统

我一直在使用这个库进行前端
api保护

有时后端会给我一个
null
或一个空对象
{}
分解页面。。。无法读取空的属性xxx…

为api的响应编写一个
拦截器
,使用它,无论
res
的数据结构有多深,都可以捕获脏数据


就个人而言,我已经修改了
TySheMo
的源代码,这确实是一项伟大的工作

我认为这并不像你想象的那么简单。如何处理错误?假阳性?假阴性?那么嵌套数据呢,它会一次又一次地生成断言吗?模块也一样。对束大小/带宽的影响?这并不是说这些问题无法解决,但其中一些问题需要在权衡之间做出决定,而这更难做好。我同意,从实现这种Babel插件的角度来看,这并不简单。但是,从插件用户的角度来看,这将是非常简单的:只需添加
obj typeof MyType
和“bam”,您就有一个运行时检查:-)。您能解释一下,您对“simple”的理解吗?有相当多的解决方案,而且io ts在某种程度上是相对的。简单易用。你想要一个没有运行时依赖项的代码生成器,使用TS编译器API等。Babel可能无法做到这一点,因为typescript预置只是剥离了类型而不处理它们。如果你只关心示例场景(具有基本属性的平面对象),您只需编写常量而不是类型,然后从中派生类型。谢谢您的回答!恐怕
instanceof
不会对数据的整个结构进行类型检查,例如,来自API的数据。至于
类验证器
类转换器验证器
,虽然它们在一定程度上提供了一个解决方案,但它们不会重复使用我的TypeScript类型来进行验证,这正是我所寻找的。