class-validator 是如何工作的?

How is class-validator works?

我的应用程序与 NestJs 分别带有服务器和客户端,在服务器端我使用 ValidationPipe 并在 DTO 类 上使用装饰器,例如

export class SearchDto {
   @IsOptional()
   readonly offset?: string;

   @IsString()
   readonly value: string;

   @IsNumber()
   readonly limit: number;
}

一切正常,但在客户端,我不能将 类 与装饰器一起使用(它的严格规则),我只需要像 type 一样使用它,- const search: SearchDto = await...

class-validator (class-transformer) 在没有 ValidationPipe 的情况下如何工作?它是像在服务器端一样包装它还是完全忽略它?它调用 __decorate 并将其放入 js 包中吗?

否则我需要这样写接口

export class SearchDto implements ISearchDto {
   @IsOptional()
   readonly offset?: string;

   @IsString()
   readonly value: string;

   @IsNumber()
   readonly limit: number;
}

export interface ISearchDto {
  offset?: string;
  value: string;
  limit: number;
}

let decorated: SearchDto;
let nonDecorated: ISearchDto;

感谢您的帮助

如果不允许将 classes 与装饰器一起使用,您可能需要考虑使用 class-validator with schemas,这样就不需要装饰器了。

Class-validator 的工作原理是通过它使用的装饰器设置字段的元数据,并且只能在类型上做这么多。然后库读取该元数据并根据 object/field 的当前类型检查它并确定其条件是否满足。该库是独立的,因此不需要访问服务器或其他任何东西。如果你查看 source code for the ValidationPipe,你会发现 Nest 只是用 class-transformer 转换对象(也称为反序列化),使 JSON 对象成为 JavaScript Class,然后通过 class-validator 运行 class,检查结果,然后 returns,对象的实例(如果在选项中设置了 transform: true),或经过验证后的原始有效负载。

虽然可以通过上面第一个 link 中描述的模式文件来模拟这些装饰器定义的元数据。