Typescript中Mongoose discriminator触发属性不兼容报错如何解决?
报错原因
核心是类型不匹配:你在声明TikTokCampaignSchema的时候没有显式指定泛型参数,TypeScript 自动将其推导为默认的Schema<Document<any, any, any>, Model<any>>类型,和discriminator方法要求的Schema<TikTokCampaignDocument, TikTokCampaignModel>类型不兼容,所以触发了TS2345类型错误。
另外还有一个隐藏问题:TikTokCampaignInterface没有继承BaseCampaignInterface,会导致子模型丢失基础模型的字段类型定义,后续使用也会出现类型问题。
解决方法
按以下步骤调整代码即可:
- 让
TikTokCampaignInterface继承BaseCampaignInterface,保证字段类型继承正确 - 声明
TikTokCampaignSchema时显式传入文档类型、模型类型的泛型参数,匹配discriminator的类型要求 - 基础模型的配置项中要加
discriminatorKey,这是mongoose discriminator功能的必填配置
调整后的完整代码示例:
import { Schema, model, Document, Model } from 'mongoose'; export interface BaseCampaignInterface { image_id : string; bid : number; } // 配置discriminatorKey,用于区分子模型类型 const baseOptions = { discriminatorKey: 'campaign_type' }; const baseCampaignSchema = new Schema<BaseCampaignInterface>({ image_id : { type: String, required: false}, bid : { type : Number, required : false} }, baseOptions); export const BaseCampaignModel = model("Campaign", baseCampaignSchema); // 继承基础模型接口 export interface TikTokCampaignInterface extends BaseCampaignInterface { profile_image : string; ad_id : string } export interface TikTokCampaignDocument extends TikTokCampaignInterface, Document { minify(): unknown; } export interface TikTokCampaignModel extends Model<TikTokCampaignDocument> { } // 创建Schema时显式指定泛型参数,匹配类型要求 export const TikTokCampaignSchema: Schema<TikTokCampaignDocument, TikTokCampaignModel> = new Schema({ profile_image : { type : String}, ad_id : { type : String } }); // 报错消失 export const TikTokModel = BaseCampaignModel.discriminator< TikTokCampaignDocument, TikTokCampaignModel >("TikTokCampaign", TikTokCampaignSchema);
内容的提问来源于stack exchange,提问作者Süleyman Ali Akpınar
相关产品推荐
相关产品推荐

