将 Array.prototype.includes 与 Typescript 一起使用时 Jest 测试失败?
Jest test failing when using Array.prototype.includes with Typescript?
我开始在这个项目中使用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 似乎没有采用 属性 打字稿配置,其中确实包括:
"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
中的错误仍然存在。)
我开始在这个项目中使用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 似乎没有采用 属性 打字稿配置,其中确实包括:
"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
中的错误仍然存在。)