3

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

事实上,类型可以让人们少犯错误。例如,在 中Haskell,可以说,任何数据类型都必须有一个值,如果它不允许Int,你就不能指定null或指定一个值。undefined无论如何,您可以指定一个包装器Maybe Int,使其可以为。这意味着该值是否为空,如果它不为空,则可以提取该值。但是您必须首先检查它是否为空,没有办法先访问该值。

Closure Compiler在静态验证数据类型方面做得很好。缺少一些东西,例如更强的空/未定义验证。从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. 这是胡说八道吗?
4

2 回答 2

4

有很多库可以帮助验证 JavaScript 中的数据类型,但我相信最全面和流行的一个是tcomb(及其相关库tcomb-validation)。

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

于 2016-04-28T22:16:30.563 回答
1

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

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

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

后来你code比较number

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

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

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

于 2017-04-05T07:24:30.760 回答