2017-08-10 37 views
5

Stworzyłem schemat Mongoose i dodałem kilka statycznych metod dla Modelu o nazwie Kampania.Mongoose statyczne definicje modeli w Maszynopisie

Jeśli mam kampanię console.log, widzę obecne na niej metody. Problem polega na tym, że nie wiem, gdzie dodać te metody, aby Maszyskopis był ich świadom.

Jeśli dodać je do mojego CampaignModelInterface, są one dostępne jedynie dla instancji modelu (lub przynajmniej TS myśli są).

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 

Próbowałem też dostępu do niego poprzez Campaign.schema.statics, ale bez powodzenia.

Może ktoś doradzić jak TS niech wiedzą na temat metod obecnych w modelu, a nie instancji modelu?

Odpowiedz

4

Odpowiedziałem na bardzo podobne pytanie w sprawie here, chociaż odpowiem na twoje pytanie (w większości z trzecią sekcją mojej drugiej odpowiedzi), ponieważ podałeś inny schemat. Jest pomocny fragment z typami Mongoose, który jest dość ukryty, ale istnieje sekcja o static methods.


Zachowanie, które opisane jest zupełnie normalne - Maszynopis jest powiedziano, że Schema (obiekt, który opisuje pojedynczych dokumentów) ma metodę zwaną getLiveCampaigns.

Zamiast tego musisz powiedzieć Maszynistce, że metoda znajduje się w modelu, a nie w schemacie. Po zakończeniu można uzyskać dostęp do metod statycznych zgodnie ze zwykłą metodą Mongoose. Możesz to zrobić przez:

// 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

Dziękujemy! Zaskoczony, nie natknąłem się na twoją oryginalną odpowiedź przed :) Udało mi się to zrobić działa, jak sugerujesz. Jeśli mam go poprawnie, będę teraz umieścić wszystkie moje metody Schema.static na CampaignModelInterface i wszystkie metody Schema.method na CampaignDocumentInterface? –

+0

Cóż, ja osobiście mam to ustawione tak, że 'CampaignDocumentInterface' zawiera tylko schemat (jak zdefiniowano w' CampaignSchema'). "CampaignInterface" zawiera wszystkie metody 'Schema.method', a' CampaignModelInterface' zawiera wszystkie metody 'Schema.static'. –

+0

Możesz zadeklarować swoje metody 'Schema.method' również w' CampaignDocumentInterface', wolę oddzielenie osobiście. –