3

使用 TypeScript 或 Facebook 的 Flow(type) 我可以静态输入变量,例如

function add (x: integer, y: integer) { ... }

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

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

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

每次需要进行类型检查时,我肯定可以手动放置警卫,但这感觉很无聊和重复。

4

3 回答 3

3

https://github.com/codemix/babel-plugin-typecheck做你想做的事。

还有https://gcanti.github.io/flowcheck/但它看起来有点废弃。

我个人没有使用过这些库中的任何一个。似乎它们可能涵盖不到 100% 的 Flow 语法。

于 2016-05-13T19:28:55.933 回答
1

无论您选择哪种方式,您都不会仅从 javascript 中获得它,因为 javascript 在这种意义上没有类型的概念。

我从来没有使用过 fb flow,所以我无法对此进行回复,但是我认为你有以下选项:(按照复杂性的顺序以及它没有意义的程度)

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

  2. 使用验证开始每个函数 与
    前一个函数非常相似,只是您将自己在每个函数中包含代码,而不是修改编译器来执行此操作。
    您可以拥有一个全局函数,将声明的参数的元数据和传递的实际参数作为参数。
    这将使代码变得非常丑陋,并且维护起来也不会很有趣。

  3. 在类的情况下,您可以使用装饰器
    装饰器功能是相当新的,但打字稿允许您使用它,如果您想对类进行此验证,那么这是迄今为止解决您的问题的最佳解决方案。

  4. 为你的库生成一个定义文件
    如果你问我这是最好的选择。
    您不需要在每个函数中进行检查来污染您的代码。不仅如此,您永远无法控制谁在使用您的库或他们如何使用它,因此甚至无法尝试。
    为此,您的 lib 使用者将需要自己编写打字稿。

于 2016-05-13T16:22:48.397 回答
1

你也可以试试babel-plugin-runtyper,它在运行时执行类型检查,不需要手动注解。
对于您的示例,如果函数如下所示:

function add(x, y) {
   return x + y;
}

你称它为

add('1', 0);

您将在控制台中收到警告:

不同类型的加运算:“1”(字符串)+ 0(数字)

于 2017-03-31T22:46:20.800 回答