使用TypeScript或Facebook的Flow(类型),我可以静态输入像
这样的变量function add (x: integer, y: integer) { ... }
TypeScript和Flow都会在编译时中捕获任何非法调用,例如add('1',0)
。
但是,在编译和导出库时,类型消失了。这意味着,使用该函数的库使用者不会出现错误,这可能会导致难以调试的问题。
有没有办法自动生成在运行时会抛出完全相同错误的其他代码?
每次预计会出现类型检查时,我肯定会手动放置防护装置,但这会让人觉得无聊和重复。
答案 0 :(得分:3)
https://github.com/codemix/babel-plugin-typecheck做你想做的事。
还有https://gcanti.github.io/flowcheck/,但看起来有点遗弃。
我没有亲自使用过任何这些库。似乎它们可能覆盖不到100%的Flow语法。
答案 1 :(得分:1)
您还可以尝试在运行时执行类型检查的babel-plugin-runtyper,并且不需要手动注释 对于您的示例,如果函数如下所示:
function add(x, y) {
return x + y;
}
你称之为
add('1', 0);
您将在控制台中收到警告:
不同类型的Plus操作:" 1" (字符串)+ 0(数字)
答案 2 :(得分:0)
你无法从javascript那里得到它,无论你选择哪个,因为javascript在这个意义上没有类型的概念。
我从来没有使用过fb流程,所以我无法对此做出回复,但是这里的打字稿是我认为你拥有的选项:(按照复杂程度和它没有多少的顺序)有道理)
修改typescript编译器以自动添加运行时参数验证
您可以use the compiler API并注入一段代码来验证函数的参数。编译器将告诉您参数名称和类型是什么,它们是否是可选的等等
我只是将其作为一个选项,但在我看来,它是一个非常混乱的解决方案。
通过验证启动每项功能
就像前一个一样,只是你自己在每个函数中包含代码,而不是修改编译器来执行此操作。
您可以使用一个全局函数,将声明的参数的元数据和传递的实际参数作为参数
这将使代码变得非常丑陋,维护起来并不会很有趣。
如果是课程,您可以使用装饰器
The decorators feature非常新,但是typescript允许你使用它,如果你想在类上做这个验证,那么这是迄今为止你的问题的最佳解决方案。
为您的库生成定义文件
如果你问我,这是最好的选择
您不需要通过检查每个功能来污染您的代码。更重要的是,你永远无法控制谁使用你的lib或他们如何使用它,所以它甚至失败了。甚至尝试。
为此,您的lib消费者需要自己编写打字稿。