Javascript 将Array.prototype.includes与Typescript一起使用时Jest测试失败?
我开始在这个项目中使用Array.prototype.includes: 它使用Angular Package格式进行打包,源位于以下目录中: 项目构建良好,但是当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
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并检查它是否存在