javascript - 将 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"
]
想法?
解决方案
您误解了错误。这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
有两个参数 -target
和exlude
. (顺便说一句,那是拼写错误,应该exclude
用c
.) 是的,exlude
用 标记为可选?
,所以你可以省略它,但是在validate
你使用的函数内部exlude
(在崩溃的行中)没有首先检查是否它是undefined
,所以你最终打电话undefined.includes(p)
!
老实说,我不确定为什么 TypeScript 编译器此时没有抱怨。(也许评论者知道为什么......)
无论如何,解决方案是[]
在函数定义中设置默认值validate.ts
:
export function validate(target: any, exlude: string[] = []): ObjectErrors {
(当然在调用validate(IDI, [])
函数validate
(