如何在运行时在JavaScript中生成类型检查?

时间:2016-05-13 12:11:37

标签: javascript types typescript typechecking flowtype

使用TypeScript或Facebook的Flow(类型),我可以静态输入像

这样的变量
function add (x: integer, y: integer) { ... }

TypeScript和Flow都会在编译时中捕获任何非法调用,例如add('1',0)

但是,在编译和导出库时,类型消失了。这意味着,使用该函数的库使用者不会出现错误,这可能会导致难以调试的问题。

有没有办法自动生成在运行时会抛出完全相同错误的其他代码?

每次预计会出现类型检查时,我肯定会手动放置防护装置,但这会让人觉得无聊和重复。

3 个答案:

答案 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流程,所以我无法对此做出回复,但是这里的打字稿是我认为你拥有的选项:(按照复杂程度和它没有多少的顺序)有道理)

  1. 修改typescript编译器以自动添加运行时参数验证
    您可以use the compiler API并注入一段代码来验证函数的参数。编译器将告诉您参数名称和类型是什么,它们是否是可选的等等 我只是将其作为一个选项,但在我看来,它是一个非常混乱的解决方案。

  2. 通过验证启动每项功能
    就像前一个一样,只是你自己在每个函数中包含代码,而不是修改编译器来执行此操作。
    您可以使用一个全局函数,将声明的参数的元数据和传递的实际参数作为参数 这将使代码变得非常丑陋,维护起来并不会很有趣。

  3. 如果是课程,您可以使用装饰器
    The decorators feature非常新,但是typescript允许你使用它,如果你想在类上做这个验证,那么这是迄今为止你的问题的最佳解决方案。

  4. 为您的库生成定义文件
    如果你问我,这是最好的选择 您不需要通过检查每个功能来污染您的代码。更重要的是,你永远无法控制谁使用你的lib或他们如何使用它,所以它甚至失败了。甚至尝试。
    为此,您的lib消费者需要自己编写打字稿。