JavaScript代码合同库?

Chr*_*ter 14 javascript code-contracts

我刚刚开始一个新的Web应用程序,我想在我的JavaScript中实现某种形式的contract'esque样式验证.我做了一些快速的谷歌搜索,并遇到了JsContact,但语法不是我想到的.有人知道其他图书馆吗?

我想我希望语法类似于

String.prototype.padLeft = function(c, width) {
  Verify.value(c).isRequired().isNotNull().isChar();
  Verify.value(width).isRequired().isNotNull().isNumber().greaterThan(0);

  ...

  Verify.value(result).isNotNull();

  return result;
};
Run Code Online (Sandbox Code Playgroud)

虽然将我自己的库与我想要的语法/方法放在一起不会花费很长时间,但如果其他人已经完成了工作并且它足够接近,那么它将节省我一些时间.提前致谢.

UPDATE

我将没有时间在今天下午工作,所以我会再花几个小时来看看是否有人有任何建议.如果没有,我会发布我在某处创建的任何内容作为下面的答案供其他人参考,如果他们愿意的话.

我还考虑了一些有意义的API,我现在正在考虑像(人为的例子):

 function searchUser(firstName, middleInit, lastName) {
   Verify.value(firstName).isString().matching(/\w+/);       // Must have value
   Verify.value(middleInit).whenNotNull().isChar();          // May be null, but not undefined
   Verify.value(lastName).isString().withMinimumLengthOf(2); // Must have value

   ...
 }

 function syncTime(serverTime, now) {
   Verify.value(serverTime).isDate();         // Must have value.
   Verify.value(now).whenDefined().isDate();  // May be undefined, but not null.

 }
Run Code Online (Sandbox Code Playgroud)

我当前的想法是容忍NULL或UNDEFINED值是非典型的(至少对我而言?),而不是显式指定值.isNotNull()你实际上会禁用.whenDefined()或.whenNotNull()的规则如上所示.我可能会在UNDEFINED上使.whenNotNull()没有错误,但我认为NULL与UNDEFINED是一个重要的区别; 我们会看到......所有其他方法都很典型......想法?评论?

Chr*_*ter 5

鉴于没有人推荐任何现有的图书馆,或者我认为这是一个好主意我疯了,我继续把一个基本的图书馆拼凑起来.代码不是很花哨,但它可以实现我想要的功能,并且运行起来相当快(IE中每毫秒大约40个链式检查).

我决定使用最终语法:

function syncTime(serverTime, now) {
  Verify.value(serverTime).always().isDate();   // Cannot be undefined or null.
  Verify.value(now).whenDefined().isDate();     // Cannot be null, but must be date when defined.

  //Code
}

function searchForUser(firstName, middleInit, lastName) {
  Verify.value(firstName).always().isString().withMinimumLengthOf(2);  // Cannot be undefined or null.
  Verify.value(lastName).always().isString().withMinimumLengthOf(2);   // Cannot be undefined or null.
  Verify.value(middleInit).whenNotNull().isChar().between('A', 'Z');   // Cannot be undefined, but must be single char string when not null.

  //Code
}
Run Code Online (Sandbox Code Playgroud)

我通过.always()检查选择了一个明确的"必须有价值",我个人觉得它更好阅读; 但我可以看到一些另一种方式.

鉴于源代码超出了我想在此答案中发布的内容,如果您对源代码感兴趣,请访问此CodePlex Wiki页面.我想它转向更流畅的断言库; 但它做我需要的.

更新

我在上面链接的CodePlex页面上更新了源代码.具体来说,我重构了Verify类以使用'值上下文',而不是总是构建新的Verifier对象; 大大提高了IE的性能(从来不是FireFox或Chrome的问题)...现在在IE中每ms处理大约100个链式检查.