2017-08-10 17 views
5

में स्थिर मॉडल परिभाषाओं मैं एक नेवला स्कीमा बना दिया और मॉडल, नामित अभियान के लिए कुछ स्थिर तरीकों गयी।नेवला टाइपप्रति

अगर मैं अभियान console.log मैं तरीकों उस पर उपस्थित देख सकते हैं। समस्या यह है कि मुझे नहीं पता कि उन विधियों को कहां जोड़ना है ताकि टाइपस्क्रिप्ट उनके बारे में भी जागरूक हो।

तो मैं उन्हें अपने CampaignModelInterface में जोड़ने के लिए, वे मॉडल की घटनाओं के लिए ही उपलब्ध हैं (या कम से कम टीएस सोचता है कि वे कर रहे हैं)।

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 के माध्यम से उस तक पहुंचने में कोशिश की, लेकिन भाग्य के बिना।

किसी टीएस मॉडल, नहीं मॉडल उदाहरणों पर उपस्थित तरीकों के बारे में पता करने के लिए कैसे को सलाह कर सकते हैं?

उत्तर

4

मैं, here पर एक बहुत समान प्रश्न का उत्तर दिया, हालांकि मैं तुम्हारा (ज्यादातर मेरे अन्य जवाब के तीसरे खंड के साथ) के रूप में आप एक अलग स्कीमा प्रदान की है जवाब देंगे। मोंगोस टाइपिंग के साथ एक उपयोगी रीडमे है जो काफी छिपी हुई है, लेकिन static methods पर एक अनुभाग है।


व्यवहार है कि आप वर्णित पूरी तरह से सामान्य है - टाइपप्रति बताया जा रहा है स्कीमा (वस्तु जो व्यक्तिगत दस्तावेज़ों का वर्णन करता है) विधि getLiveCampaigns कहा जाता है।

इसके बजाय, आप टाइपप्रति बताने के लिए कि विधि मॉडल, नहीं स्कीमा पर है की जरूरत है। एक बार पूरा हो जाने पर, आप सामान्य मोंगोस विधि के अनुसार स्थिर विधियों तक पहुंच सकते हैं। आप इसे निम्न द्वारा कर सकते हैं:

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

धन्यवाद! आश्चर्यचकित मैं पहले आपके मूल उत्तर में नहीं आया :) जैसा कि आपने सुझाव दिया था, इसे काम करने में सक्षम था। अगर मैं इसे सही ढंग से मिल गया, मैं अब CampaignModelInterface पर मेरे सभी Schema.static तरीकों और CampaignDocumentInterface पर सभी Schema.method तरीकों डाल देंगे? –

+0

वैसे मैंने व्यक्तिगत रूप से इसे स्थापित किया है ताकि 'अभियान डॉक्यूमेंटइंटरफेस' में केवल स्कीमा (जैसा कि 'अभियानशेमा' में परिभाषित किया गया है) शामिल है। 'अभियान इंटरफेस' में आपकी सभी 'Schema.method' विधियां हैं, और' अभियानमोडेलइंटरफेस 'में आपकी सभी' Schema.static' विधियां हैं। –

+0

आप 'CampaignDocumentInterface' में भी अपनी' Schema.method' विधियों की घोषणा कर सकते हैं, मैं व्यक्तिगत रूप से अलगाव को प्राथमिकता देता हूं। –