当nesjsMap一个用OmitType创建的Dto类时,我在一个简单的POST端点上遇到了问题(所有以这种方式创建的dto都会发生)。这对我来说很奇怪,因为这个端点和其他端点都工作得很好,也许是版本的问题?
我希望你能帮助我,谢谢!
错误代码:
TypeError: Class constructor OmitTypeClass cannot be invoked without 'new'
improvein-challenge-nestjs-1 | at new CreateActorDto (/usr/local/apps/myapp/build/src/features/actor/actors.model.js:65:42)
improvein-challenge-nestjs-1 | at TransformOperationExecutor.transform (/usr/local/apps/myapp/node_modules/src/TransformOperationExecutor.ts:160:22)
improvein-challenge-nestjs-1 | at ClassTransformer.plainToInstance (/usr/local/apps/myapp/node_modules/src/ClassTransformer.ts:77:21)
improvein-challenge-nestjs-1 | at Object.plainToClass (/usr/local/apps/myapp/node_modules/src/index.ts:71:27)
improvein-challenge-nestjs-1 | at ValidationPipe.transform (/usr/local/apps/myapp/node_modules/@nestjs/common/pipes/validation.pipe.js:60:39)
improvein-challenge-nestjs-1 | at /usr/local/apps/myapp/node_modules/@nestjs/core/pipes/pipes-consumer.js:16:33
improvein-challenge-nestjs-1 | at processTicksAndRejections (node:internal/process/task_queues:95:5)
actors.controller
import {
Body,
Controller,
Headers,
HttpStatus,
Logger,
Post,
UseGuards,
} from '@nestjs/common';
import {
ApiBearerAuth,
ApiBody,
ApiConflictResponse,
ApiCreatedResponse,
ApiExtraModels,
ApiTags,
ApiUnauthorizedResponse,
getSchemaPath,
} from '@nestjs/swagger';
import { ActorsService } from './actors.service';
import { CreateActorDto, CreateActorResponse } from './actors.model';
import { Actor } from './actor.entity';
import BaseResponse from '../../models/base.response.model';
import BaseExceptionResponse from '../../models/base.exception.response.model';
import { ApiTagsEnum } from '../../enums/api.tags.enum';
@Controller('actors')
export class ActorsController {
constructor(private readonly actorsService: ActorsService) {}
@ApiExtraModels(BaseResponse, CreateActorResponse)
@ApiCreatedResponse({
schema: {
allOf: [
{ $ref: getSchemaPath(BaseResponse) },
{
properties: {
content: {
type: 'array',
items: { $ref: getSchemaPath(CreateActorResponse) },
},
},
},
],
},
description: 'Actors',
})
@ApiUnauthorizedResponse({
type: BaseExceptionResponse,
description: 'Unauthorized',
})
@ApiConflictResponse({
type: BaseExceptionResponse,
description: 'Duplicate actor name',
})
@ApiBearerAuth('access-token')
@ApiTags(ApiTagsEnum.ACTORS)
@ApiBody({ type: CreateActorDto })
//@UseGuards(AuthGuard)
@Post()
async createActor(
@Headers() headers,
@Body() payload: CreateActorDto,
): Promise<BaseResponse<CreateActorResponse>> {
const response: Actor = await this.actorsService.createActor(payload);
Logger.log(response);
return new BaseResponse(
HttpStatus.CREATED,
'Actor',
new CreateActorResponse(response),
);
}
}
actors.model
import { ApiProperty, OmitType } from '@nestjs/swagger';
import { IsNotEmpty, IsOptional, IsString } from 'class-validator';
import { Actor } from './actor.entity';
export class BaseActor {
@ApiProperty()
id: number;
@ApiProperty({
type: 'string',
required: false,
example: new Date().toLocaleDateString(),
})
@IsNotEmpty()
@IsString()
birthDate: string;
@IsNotEmpty()
@IsString()
@ApiProperty({ type: 'string', minLength: 1, required: true })
name: string;
@IsOptional()
@IsString()
@ApiProperty({ type: 'string', minLength: 1, required: false })
nationality?: string;
}
export class CreateActorDto extends OmitType(BaseActor, ['id']) {}
export class CreateActorResponse extends BaseActor {
constructor(actor: Actor) {
super();
Object.assign(this, actor);
}
}
设备依赖项:
"devDependencies": {
"@nestjs/cli": "^10.0.3",
"@nestjs/schematics": "^10.0.1",
"@nestjs/testing": "^10.0.2",
"@types/express": "^4.17.13",
"@types/jest": "29.5.1",
"@types/node": "^16.11.10",
"@types/supertest": "^2.0.11",
"@typescript-eslint/eslint-plugin": "^5.0.0",
"@typescript-eslint/parser": "^5.0.0",
"eslint": "^8.0.1",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^4.0.0",
"jest": "29.5.0",
"prettier": "^2.3.2",
"source-map-support": "^0.5.20",
"supertest": "^6.1.3",
"ts-jest": "29.1.0",
"ts-loader": "^9.2.3",
"ts-node": "10.7.0",
"tsconfig-paths": "4.2.0",
"typescript": "4.5.2"
},
1条答案
按热度按时间jhiyze9q1#
https://bobbyhadz.com/blog/typescript-class-constructor-cannot-be-invoked-without-new
在TypeScript中,如果没有“new”,就无法调用类构造函数当tslog.json中的target属性设置为低于es6,或者在没有new运算符的情况下示例化类时,会出现“Class constructor cannot be invoked without new”错误。
要解决这个错误,请将target设置为es6,并在示例化类时使用new运算符。
你应该做的第一件事是打开你的tslog.json文件,并确保目标设置为es6或更新。
tsconfig.json