首页 > 解决方案 > 将 Array.prototype.includes 与 Typescript 一起使用时,Jest 测试失败?

问题描述

我开始在这个项目中使用 Array.prototype.includes:

https://github.com/fireflysemantics/validator

它是使用 Angular 包格式打包的,源代码在这个目录中:

https://github.com/fireflysemantics/validator/tree/master/projects/validator

该项目构建良好,但是在运行 Jest 测试时会发生此错误:

 FAIL  projects/validator/src/lib/decorators/IsDefined.spec.ts
  ● should create an error when using validate

    TypeError: Cannot read property 'includes' of undefined

      35 |   const mc: MetaClass = ValidationContainer.metaClasses.get(cn);
      36 |   if (mc) {
    > 37 |     const properties: string[] = mc.properties.filter(p => !exlude.includes(p))

所以似乎 Jest 没有选择属性 typescript 配置,其中包括:

    "lib": [
      "dom",
      "es2018"
    ]

想法?

标签: javascriptangulartypescriptjestjsangular-package-format

解决方案


您误解了错误。这includes不是不允许的。

这是它无法访问includes值的属性undefined,即显然您尝试这样做undefined.includes,所以这意味着exlude必须是undefined


在您IsDefined.spec.ts的电话中,您是这样称呼validate的:

it(`should create an error when using validate`, ()=>{
  let IDI = new IsDefinedInvalid();
  let e = validate(IDI);
  expect(e.valid).toBeFalsy();
});

因此,您仅将 1 个参数 ( IDI) 传递给validate. 但是,在validate.ts您定义这样的函数时:

export function validate(target: any, exlude?: string[]): ObjectErrors {
  let oes: ObjectErrors = new ObjectErrors();
  const cn: string = target.constructor.name;
  const mc: MetaClass = ValidationContainer.metaClasses.get(cn);
  if (mc) {
    const properties: string[] = mc.properties.filter(p => !exlude.includes(p))
    properties.forEach(p => {
      if (!validateProperty(target, p, oes)) {
        oes.valid = false;
      }
    });
  }
  return oes;
}

如您所见,validate两个参数 -targetexlude. (顺便说一句,那是拼写错误,应该excludec.) 是的,exlude用 标记为可选?,所以你可以省略它,但是在validate你使用的函数内部exlude(在崩溃的行中)没有首先检查是否它是undefined,所以你最终打电话undefined.includes(p)

老实说,我不确定为什么 TypeScript 编译器此时没有抱怨。(也许评论者知道为什么......)

无论如何,解决方案是[]在函数定义中设置默认值validate.ts

export function validate(target: any, exlude: string[] = []): ObjectErrors {

(当然在调用validate(IDI, [])函数validate


推荐阅读