我已经使用Closure Compiler一段时间了,我一直想知道是否有一些引擎可以对数据类型进行运行时验证.
事实是类型允许人们减少错误.例如,在Haskell中,让我们说Int,任何数据类型都必须有一个值,如果它不允许,你就不能指定null或undefined给一个值.无论如何,你可以指定一个像Maybe Int这样的包装器使它可以为空.这意味着该值为null或不为null,如果它不为null,则可以提取该值.但是你首先要检查它是否为空,否则无法首先访问该值.
Closure Compiler在静态验证数据类型方面做得非常好.有些东西丢失了,比如更强的null / undefined验证.从Closure Compiler中逃脱的其他事情是使用从服务器下载的数据进行类型检查.即使您信任您的服务器,规格也会发生变化,您的代码也会变更.测试可以验证这种不匹配,但如果这些验证可以直接在代码中进行则会更好.他们甚至可以记录试图匹配类型的错误.
以下代码是服务器响应的极简主义示例:
/**
* 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中的数据类型,但我相信最全面和最受欢迎的库是tcomb(及其相关库tcomb-validation).
还有来自为Node.js创建hapi的人们的joi.但是,我发现尝试在浏览器中运行joi可能很麻烦.此外,与tcomb相比,我发现使用joi捕获复杂数据类型更加困难,但这取决于您的用例.