如何检查Nest.js中的元类型类型

在创建第一个管道时,我发现了一个问题,但无法检查元类型的类型。假设我有一个元类型-> [Function: MathEquationDTO]MathEquationDTO是一个类。

在文档中,我可以看到它们正在通过创建诸如[String,Boolean,Number]之类的函数数组,然后使用方法.includes()在此数组中搜索元类型的类型来检查元类型的类型-我能做同样的事情还是可能有一个更好,更清晰的解决方案(函数数组看起来不太好)吗?

还有一个问题。我不知道如何验证和转换数据。接口PipeTransform<IN,OUT>有两种类型:

  • IN ->管道内的类型​​
  • OUT ->应该返回转换的类型

所以我应该如何在控制器内部定义查询类型。如果将其设置为 IN 类型,那么我将无法访问 OUT 类型,或者这些类型的类型会有所不同吗?或者,也许我应该创建两个不同的管道,一个用于验证,另一个用于转换

管道

import { PipeTransform,Injectable,ArgumentMetadata,BadRequestException,Type } from '@nestjs/common';
import { validate } from 'class-validator';
import { plainToClass } from 'class-transformer';
import { MathEquationDTO } from '../math/dto/MathEquationDTO';
import { TMathEquation } from '../math/interface/TMathEquation';

@Injectable()
export class ValidationPipe implements PipeTransform<MathEquationDTO,Promise<TMathEquation>> {
  async transform(value: any,{ metatype }: ArgumentMetadata) {
    console.log('MetaTYPE',metatype);
    if (!this.toValidate(metatype)) {
       throw new BadRequestException('Validation failed');
    }
    const object = plainToClass(metatype,value);
    const errors = await validate(object);
    if (errors.length > 0) {
      throw new BadRequestException('Validation failed');
    }
    return {
      value: value.value.map(stringValue => parseInt(stringValue,10)),};
  }

  private toValidate(metatype: Function): boolean {
    const types: Function[] = [String,Number,Array,Object];
    return !types.includes(metatype);
  }
}

控制器

import { Controller,Get,Query,UseFilters,UsePipes } from '@nestjs/common';
import { MathService } from './math.service';
import { MathExceptionFilter } from '../exceptions/filters/math-exception.filter';
import { MathEquationDTO } from './dto/MathEquationDTO';
import { ValidationPipe } from '../pipes/MathValidationPipe';

@Controller('math')
export class MathController {
  constructor(private readonly appService: MathService) {}

  @Get('add')
  @UseFilters(new MathExceptionFilter())
  @UsePipes(ValidationPipe)
  addTwoNumbers(@Query() dataToCount: MathEquationDTO): number {
    return this.appService.addTwoNumbers(dataToCount.value);
  }
}

MathEquationDTO

import { IsString } from 'class-validator';

export class MathEquationDTO {
  @IsString({
    each: true,})
  readonly value: string[];
}

TMathEquation

export interface TMathEquation {
  value: number[];
}
gouyumei 回答:如何检查Nest.js中的元类型类型

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3149418.html

大家都在问