为什么我们在使用 class-transformer 时不应该使用 enableImplicitConversion?

Why should we NOT use enableImplicitConversion when using class-transformer?

class-transformer docs 说:

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],这可能不是您想要的

这里是 stackblitz example

@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

Transform Stackblitz example