2017-08-10 95 views
5

我創建了一個Mongoose Schema併爲模型添加了一些名爲Campaign的靜態方法。在Typescript中的Mongoose Static模型定義

如果我console.log戰役,我可以看到它的方法。問題是我不知道在哪裏添加這些方法,以便Typescript也知道它們。

如果我將它們添加到CampaignModelInterface中,它們僅適用於模型的實例(或者至少TS認爲它們是)。

campaignSchema.ts

export interface CampaignModelInterface extends CampaignInterface, Document { 
     // will only show on model instance 
    } 

    export const CampaignSchema = new Schema({ 
     title: { type: String, required: true }, 
     titleId: { type: String, required: true } 
     ...etc 
)} 

    CampaignSchema.statics.getLiveCampaigns = Promise.method(function(){ 
     const now: Date = new Date() 
     return this.find({ 
      $and: [{startDate: {$lte: now} }, {endDate: {$gte: now} }] 
     }).exec() 
    }) 

    const Campaign = mongoose.model<CampaignModelInterface>('Campaign', CampaignSchema) 
    export default Campaign 

我也試圖通過Campaign.schema.statics訪問它,但沒有運氣。

任何人都可以建議如何讓TS知道模型上存在的方法,而不是模型實例嗎?

回答

4

我回答了一個超過here的非常類似的問題,雖然我會回答你的問題(大部分是我的其他答案的第三部分),因爲你提供了不同的模式。有一個很有幫助的自述文件,這個文件很隱藏,但是有一個關於static methods的章節。


,你描述的行爲是完全正常的 - 打字稿被告知架構(描述個人文件的對象)有一個名爲getLiveCampaigns的方法。

相反,您需要告訴Typescript該方法在模型上,而不是模式。完成後,您可以按照正常的Mongoose方法訪問靜態方法。你可以通過以下方式來實現:

// CampaignDocumentInterface should contain your schema interface, 
// and should extend Document from mongoose. 
export interface CampaignInterface extends CampaignDocumentInterface { 
    // declare any instance methods here 
} 

// Model is from mongoose.Model 
interface CampaignModelInterface extends Model<CampaignInterface> { 
    // declare any static methods here 
    getLiveCampaigns(): any; // this should be changed to the correct return type if possible. 
} 

export const CampaignSchema = new Schema({ 
    title: { type: String, required: true }, 
    titleId: { type: String, required: true } 
    // ...etc 
)} 

CampaignSchema.statics.getLiveCampaigns = Promise.method(function(){ 
    const now: Date = new Date() 
    return this.find({ 
     $and: [{startDate: {$lte: now} }, {endDate: {$gte: now} }] 
    }).exec() 
}) 

// Note the type on the variable, and the two type arguments (instead of one). 
const Campaign: CampaignModelInterface = mongoose.model<CampaignInterface, CampaignModelInterface>('Campaign', CampaignSchema) 
export default Campaign 
+0

謝謝!驚訝我沒有遇到你的原始答案:) 能夠得到它的工作,如你所建議的。 如果我沒有弄錯,我現在將所有的Schema.static方法放在CampaignModelInterface和CampaignDocumentInterface上的所有Schema.method方法中? –

+0

嗯,我個人建立了這樣一個'CampaignDocumentInterface'只包含Schema(如'CampaignSchema'中定義的)。 'CampaignInterface'包含所有的'Schema.method'方法,'CampaignModelInterface'包含所有'Schema.static'方法。 –

+0

您也可以在'CampaignDocumentInterface'中聲明您的'Schema.method'方法,我個人更喜歡分離。 –