Javascript运行时类型检查引擎
我已经使用闭包编译器一段时间了,我一直在想是否有某种引擎可以对数据类型进行运行时验证 事实上,类型允许人们犯更少的错误。例如,在Javascript运行时类型检查引擎,javascript,validation,types,scalability,type-systems,Javascript,Validation,Types,Scalability,Type Systems,我已经使用闭包编译器一段时间了,我一直在想是否有某种引擎可以对数据类型进行运行时验证 事实上,类型允许人们犯更少的错误。例如,在Haskell中,比方说Int,任何数据类型都必须有一个值,如果不允许,就不能将null或未定义的指定为值。无论如何,您可以指定一个像Maybe Int这样的包装器,使其可为空。这意味着该值是否为null,如果不是null,则可以提取该值。但是您必须首先检查它是否为null,无法首先访问该值 闭包编译器在静态验证数据类型方面做得相当好。缺少一些东西,比如更强的空/未定义
Haskell
中,比方说Int
,任何数据类型都必须有一个值,如果不允许,就不能将null
或未定义的
指定为值。无论如何,您可以指定一个像Maybe Int
这样的包装器,使其可为空。这意味着该值是否为null,如果不是null,则可以提取该值。但是您必须首先检查它是否为null,无法首先访问该值
闭包编译器在静态验证数据类型方面做得相当好。缺少一些东西,比如更强的空/未定义验证。从闭包编译器中逃逸出来的其他事情是对从服务器下载的数据进行类型检查。即使您信任您的服务器,规范也会更改,代码也会更改。测试可以验证这种不匹配,但如果这些验证可以直接在代码中进行就更好了。他们甚至可以记录尝试匹配类型时发现的错误
以下代码是服务器响应的最简单示例:
/**
* Server result data types
* @param {T} t [description]
* @template T
*/
ServerResult = {
/**
* Result code from server
* @type {Number}
*/
code: 0,
/**
* Result data from server
* @type {T}
*/
data: null,
/**
* Message of the server in case something didn't go as expected
* @type {String}
*/
message: ''
};
Result.data
甚至可以是另一种数据类型(例如记录)。现在我要做的是递归地检查默认实例中包含的类型,并将其与下载的版本进行比较
有很多库可以帮助验证JavaScript中的数据类型,但我相信最全面、最流行的库是(及其相关库) 还有为Node.js创建hapi的人。然而,我发现尝试在浏览器中运行joi会很麻烦。另外,我发现使用joi比使用tcomb更难捕获复杂的数据类型,但这取决于您的用例。您也可以尝试-一个在运行时执行类型验证的Babel插件。与之相比,它不会强制您编写类型注释。相反,它从操作本身猜测变量类型 例如,如果服务器结果包含不正确的
code
值:
var ServerResult = {
code: 'unknown',
...
}
然后将code
与数字进行比较:
Runtyper将在控制台中显示警告:
不同类型的严格比较:“未知”(字符串)==0(数字)
if (ServerResult.code === 0) { ... }