TypeScript中在Mongoose钩子内访问静态方法的问题
修复Mongoose钩子中访问自定义静态方法的TypeScript错误
问题原因
- 你定义的
IReviewModel接口未包含手动添加的changeTitle静态方法,TypeScript无法识别该方法的存在。 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
相关产品推荐
相关产品推荐

