You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Владимир Соснов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:53:18