NestJS中@InjectModel装饰器报错:无法解析参数装饰器签名
修复NestJS中@InjectModel(ReviewModel)的类型错误
错误场景
学习过时NestJS课程时,使用新版nestjs-typegoose和@typegoose/typegoose依赖,添加@InjectModel(ReviewModel)装饰器时出现以下错误:
Unable to resolve signature of parameter decorator when called as an expression. Argument of type 'undefined' is not assignable to parameter of type 'string | symbol'.
修复方案
1. 更新模块中模型的注册配置
在review.module.ts的TypegooseModule.forFeature配置中,为模型添加name字段,使用类名作为注入令牌:
import { Module } from '@nestjs/common'; import { ReviewController } from './review.controller'; import { ReviewModel } from './review.model'; import { TypegooseModule } from 'nestjs-typegoose'; import { ReviewService } from './review.service'; @Module({ controllers: [ReviewController], imports: [ TypegooseModule.forFeature([ { typegooseClass: ReviewModel, schemaOptions: { collection: 'Review', }, name: ReviewModel.name // 新增:指定注入名称为类名 }, ]), ], providers: [ReviewService], }) export class ReviewModule {}
2. 修改服务中的注入参数
在review.service.ts中,将@InjectModel(ReviewModel)改为@InjectModel(ReviewModel.name),同时调整类型导入路径:
import { Injectable } from '@nestjs/common'; // 从@typegoose/typegoose根模块导入类型(新版不再从lib/types导出) import { ModelType, DocumentType } from '@typegoose/typegoose'; import { Types } from 'mongoose'; import { InjectModel } from 'nestjs-typegoose'; import { CreateReviewDto } from './dto/create-review.dto'; import { ReviewModel } from './review.model'; @Injectable() export class ReviewService { // 使用类名作为@InjectModel的参数 constructor(@InjectModel(ReviewModel.name) private readonly reviewModel: ModelType<ReviewModel>) {} async create(dto: CreateReviewDto): Promise<DocumentType<ReviewModel>> { return this.reviewModel.create(dto); } async delete(id: string): Promise<DocumentType<ReviewModel> | null> { return this.reviewModel.findByIdAndDelete(id).exec(); } async findByProductId(productId: string): Promise<DocumentType<ReviewModel>[]> { return this.reviewModel.find({ productId: new Types.ObjectId(productId) }).exec(); } }
3. 可选:简化模型定义(适配新版Typegoose)
如果仍存在类型警告,可以调整review.model.ts的写法,移除冗余的接口定义:
import { prop, TimeStamps } from '@typegoose/typegoose'; import { Types } from 'mongoose'; // 直接继承TimeStamps,无需单独定义Base接口 export class ReviewModel extends TimeStamps { @prop() name: string; @prop() title: string; @prop() description: string; @prop() rating: number; @prop() productId: Types.ObjectId; }
原因说明
新版nestjs-typegoose修改了注入机制,不再支持直接传入类作为@InjectModel的参数,必须使用注册时指定的字符串/符号令牌。同时@typegoose/typegoose的类型导出结构发生变化,需要从根模块导入相关类型。
内容的提问来源于stack exchange,提问作者Владимир Соснов
相关产品推荐
相关产品推荐

