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

TypeScript中在Mongoose钩子内访问静态方法的问题

修复Mongoose钩子中访问自定义静态方法的TypeScript错误

问题原因

  1. 你定义的IReviewModel接口未包含手动添加的changeTitle静态方法,TypeScript无法识别该方法的存在。
  2. pre钩子中this.constructor的默认类型为Function,未关联到你的自定义模型类型,导致类型校验失败。

修复步骤

1. 更新模型接口,补充静态方法声明

在IReviewModel接口中添加changeTitle的方法定义,让TypeScript知晓该静态方法属于模型:

interface IReviewModel extends Model<IReview> {
  calculateAvgRating(prodoctId: typeof Types.ObjectId): any;
  // 新增changeTitle静态方法声明
  changeTitle(title: string): Promise<void>;
}

2. 在钩子中对constructor做类型断言

在pre("save")钩子内,将this.constructor断言为IReviewModel类型,让TypeScript识别自定义静态方法:

reviewSchema.pre("save", async function () {
  const ReviewModel = this.constructor as IReviewModel;
  await ReviewModel.changeTitle(this.title);
})

完整修复代码

import { Document, Model, Types, Schema, model } from "mongoose";

interface IReview extends Document {
  rating: number;
  title: string;
  comment: string;
}

interface IReviewModel extends Model<IReview> {
  calculateAvgRating(prodoctId: typeof Types.ObjectId): any;
  changeTitle(title: string): Promise<void>;
}

const reviewSchema = new Schema<IReview, IReviewModel>({
  rating: Number,
  title: String,
  comment: String
})

reviewSchema.statics.changeTitle = async function (title: string) {
  console.log(title)
}

reviewSchema.pre("save", async function () {
  const ReviewModel = this.constructor as IReviewModel;
  await ReviewModel.changeTitle(this.title);
})

const ReviewModel = model<IReview, IReviewModel>("Review", reviewSchema)

export default ReviewModel;

内容的提问来源于stack exchange,提问作者Quantum-script

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:30:05