为什么我们在使用类转换器时不应该使用enableImplicitConversion?

TmT*_*ron 7 class-validator class-transformer

类转换器文档说:

隐式类型转换
注意如果您将类验证器与类转换器一起使用,您可能不想启用此功能。

为什么不?

我做了一些测试,没有发现任何问题。
实际上,情况恰恰相反:将class-transformer(带有和enableImplicitConversion=trueReflect -metadata)与class-validator结合使用似乎是一个完美的选择,并且NestJS开箱即用地支持它

TmT*_*ron 12

我们不应该使用隐式转换的一些原因。

实在是太宽容了

例如,当我们使用@IsString()每种类型时都会通过验证 - 即使是普通对象也会被转换为字符串[object Object],这可能不是你想要的

这是一个stackblitz 示例

@Transform()可能不起作用

例子:

class Test {
  @Transform(value => (value === "zero" ? 0 : value), {
    toClassOnly: true
  })
  val: number;
}
const transformed = plainToClass(Test, {
    val: 'zero'
  }, {
    enableImplicitConversion
  });

// transformed.val = NaN 
Run Code Online (Sandbox Code Playgroud)

这里的问题是隐式转换之前已经发生过@Transform(),并且由于它无法将字符串转换为数字,因此将值设置为NaN

转换 Stackblitz 示例