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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 13:06:04