Javascript运行时类型检查引擎

时间:2013-09-30 22:40:26

标签: javascript validation types scalability type-systems

我已经使用 Closure Compiler 一段时间了,我一直想知道是否有一些引擎可以运行时验证数据类型

事实是类型允许人们减少错误。例如,在Haskell中,让我们说Int,任何数据类型都必须有一个值,如果不是,则无法将nullundefined指定为值允许它。无论如何,你可以指定一个像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甚至可以是另一种数据类型(例如记录)。现在我正在做的是递归检查默认实例中包含的类型,并将其与下载的版本进行比较。

  1. 有更好的方法吗?
  2. 是否有可以使用的库而不是重写轮子?
  3. 这是胡说八道吗?

2 个答案:

答案 0 :(得分:4)

有很多库可以帮助验证JavaScript中的数据类型,但我认为最全面和最受欢迎的库是tcomb(及其相关库tcomb-validation)。

还为那些为Node.js创建hapi的人们提供了joi。但是,我发现尝试在浏览器中运行joi可能很麻烦。此外,与tcomb相比,我发现使用joi捕获复杂数据类型更加困难,但这取决于您的用例。

答案 1 :(得分:2)

您还可以尝试Runtyper - 一个在运行时执行类型验证的Babel插件。与tcomb相比,它不会强制您编写类型注释。相反,它从操作本身猜测变量类型。

对于您的示例,如果服务器结果包含不正确的code值:

var ServerResult = {
  code: 'unknown',
  ...
}

稍后您将code数字进行比较:

if (ServerResult.code === 0) { ... }

Runtyper将在控制台中显示警告:

  

严格比较不同类型:"未知" (字符串)=== 0(数字)