为什么我们在使用 class-transformer 时不应该使用 enableImplicitConversion?
Why should we NOT use enableImplicitConversion when using class-transformer?
Implicit type conversion
NOTE If you use class-validator together with class-transformer you propably DON'T want to enable this function.
为什么不呢?
我做了一些测试,没有发现任何问题。
实际上是相反的:使用 class-transformer (with enableImplicitConversion=true
and reflect-metadata) in combination with class-validator seems to be a perfect fit and it is supported out-of-the-box by NestJS
我们应该不使用隐式转换的一些原因。
太宽容了
例如当我们使用 @IsString()
时,每个类型都会通过验证 - 即使是普通对象也会被转换为字符串 [object Object]
,这可能不是您想要的
@Transform()
可能无效
示例:
class Test {
@Transform(value => (value === "zero" ? 0 : value), {
toClassOnly: true
})
val: number;
}
const transformed = plainToClass(Test, {
val: 'zero'
}, {
enableImplicitConversion
});
// transformed.val = NaN
这里的问题是隐式转换已经在 @Transform()
之前发生,并且由于它无法将字符串转换为数字,因此将值设置为 NaN
Implicit type conversion
NOTE If you use class-validator together with class-transformer you propably DON'T want to enable this function.
为什么不呢?
我做了一些测试,没有发现任何问题。
实际上是相反的:使用 class-transformer (with enableImplicitConversion=true
and reflect-metadata) in combination with class-validator seems to be a perfect fit and it is supported out-of-the-box by NestJS
我们应该不使用隐式转换的一些原因。
太宽容了
例如当我们使用 @IsString()
时,每个类型都会通过验证 - 即使是普通对象也会被转换为字符串 [object Object]
,这可能不是您想要的
@Transform()
可能无效
示例:
class Test {
@Transform(value => (value === "zero" ? 0 : value), {
toClassOnly: true
})
val: number;
}
const transformed = plainToClass(Test, {
val: 'zero'
}, {
enableImplicitConversion
});
// transformed.val = NaN
这里的问题是隐式转换已经在 @Transform()
之前发生,并且由于它无法将字符串转换为数字,因此将值设置为 NaN