Javascript 将Array.prototype.includes与Typescript一起使用时Jest测试失败?

Javascript 将Array.prototype.includes与Typescript一起使用时Jest测试失败?,javascript,angular,typescript,jestjs,angular-package-format,Javascript,Angular,Typescript,Jestjs,Angular Package Format,我开始在这个项目中使用Array.prototype.includes: 它使用Angular Package格式进行打包,源位于以下目录中: 项目构建良好,但是当Jest测试运行时,会发生以下错误: FAIL projects/validator/src/lib/decorators/IsDefined.spec.ts ● should create an error when using validate TypeError: Cannot read property 'i

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

它使用Angular Package格式进行打包,源位于以下目录中:

项目构建良好,但是当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"
    ]


想法?

您误解了错误。并不是说不允许包含

这是因为它无法访问未定义值上的属性include,也就是说,显然您试图执行undefined.includes,这意味着exlude必须是未定义的

在IsDefined.spec.ts中,您调用validate的方式如下:

它`在使用validate`时应创建一个错误,=>{ 设IDI=newisDefinedInvalid; 设e=validatedi; 期望、有效、可靠; }; 因此,您只传递1个参数IDI进行验证。但是,在validate.ts中,您可以这样定义函数:

导出函数validatetarget:any,exlude?:string[]:ObjectErrors{ 让oes:ObjectErrors=新的ObjectErrors; const cn:string=target.constructor.name; 常量mc:MetaClass=ValidationContainer.MetaClass.getcn; 如果mc{ 常量属性:字符串[]=mc.properties.filterp=>!exlude.includesp properties.forEachp=>{ if!validatePropertytarget,p,oes{ oes.valid=false; } }; } 返回oes; } 如您所见,validate接受两个参数-target和exlude。顺便说一下,这是拼写错误,应该用c排除。是的,exlude标记为带有?的可选项,因此根据合同可以省略它,但是在validate函数中,您在崩溃的行中使用exlude,而没有首先检查它是否未定义,因此您最终调用undefined.includesp

老实说,我不知道为什么TypeScript编译器现在没有抱怨。也许有个评论者知道为什么

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

导出函数validatetarget:any,exlude:string[]=[]:ObjectErrors{ 当然,在调用函数validatedi[]时,将第二个参数作为空数组传递也是可行的,但是validate中的错误仍然存在。

Log exlude并检查它是否存在