2015-08-27 6 views
22

करने के लिए एक वर्ग बाइंडिंग टाइपप्रति का उपयोग करना, मैं आसानी से खुद को कक्षाओं बाध्य कर सकते हैं:एक अंतरफलक

bootstrap(MyAppComponent, [MyClass]); 

हालांकि, मैं इस तरह के तरह एक अंतरफलक के लिए मेरी कक्षा बाध्य करने के लिए, चाहते हैं:

boostrap(MyAppComponent, [???]); 

जैसे कि मैं इसे निम्नानुसार इंजेक्ट कर सकता हूं:

class MyAppComponent { 
    constructor(my_class : IMyClass){ 
    } 
}; 

क्या यह कोणीय 2 में संभव है? यदि हां, तो मुझे बाध्यकारी निर्दिष्ट करने के लिए कैसे करना है?

उत्तर

24

इसे कम करने के लिए समस्या यह है कि टाइपस्क्रिप्ट संकलित होने पर इंटरफेस गायब हो जाते हैं। तो आपको एक स्ट्रिंग के साथ @ इंजेक्ट का उपयोग करना होगा।

या कोई और विकल्प नहीं है, अगर आप की जाँच the last article of Victor Savkin आप टिप्पणी में इस पा सकते हैं:

कुछ पृष्ठभूमि। टाइपस्क्रिप्ट में, इंटरफेस संरचनात्मक होते हैं और रनटाइम पर बनाए रखा नहीं जाता है। तो अगर आप इस प्रकार ILoginService उपयोग करने के लिए:

constructor(@Inject("ILoginService") s:ILoginService). 

आप एक स्ट्रिंग का उपयोग करना नहीं है - किसी भी वस्तु वहाँ में पारित किया जा सकता। हम वास्तव में ओपेक टोकन नामक एक वस्तु प्रदान करते हैं जिसका उपयोग इस उद्देश्य के लिए किया जा सकता है।

interface ILoginService { login(credentials);} 
const ILoginService = new OpaqueToken("LoginService"); 

इस तरह इस्तेमाल किया जा सकता:

constructor(@Inject(ILoginService) s:ILoginService). 
+0

'नया ओपेक टोकन (" लॉग इन सेवा ") क्यों 'लॉग इन सेवा' पास हो रही है और' ILoginService' नहीं है? –

6

मैं जानता हूँ कि अगर यह इंटरफेस के साथ संभव है के रूप में इंटरफ़ेस रनटाइम पर उपलब्ध नहीं होगा (जावास्क्रिप्ट इंटरफ़ेस के बारे में पता नहीं है न)। लेकिन यह सार वर्गों का उपयोग करके किया जा सकता है।

//abstract-parent-service.ts

export class DatabaseService{ 
    getService:()=>string; 
} 

//hibernate.service.ts

import {DatabaseService} from "./abstract-parent-service"; 

export class HibernateService implements DatabaseService{ 
    constructor() { } 
    getService() { 
    return "i am hibernate"; 
    } 
} 

//jdbc.service.ts

import {DatabaseService} from "./abstract-parent-service"; 

export class JDBCService implements DatabaseService{ 
    constructor() { } 
    getService() { 
    return "i am Jdbc"; 
    } 
} 

// cmp-a.component.ts

import {DatabaseService} from "./abstract-parent-service"; 
import {HibernateService} from "./hibernate.service"; 

@Component({ 
    selector: 'cmp-a', 
    template: `<h1>Hello Hibernate</h1>`, 
    providers: [{provide: DatabaseService, useClass: HibernateService}] 
}) 
export class CmpAComponent { 
    constructor (private databaseService: DatabaseService) { 
     console.log("Database implementation in CompA :"+this.databaseService.getService()); 
    } 
} 
क्योंकि वे पहले से ही DatabaseService साथ शादी कर ली है

//cmp-b.component.ts

import {DatabaseService} from "./abstract-parent-service"; 
import {HibernateService} from "./hibernate.service"; 

@Component({ 
    selector: 'cmp-b', 
    template: `<h1>Hello Jdbc</h1>`, 
    providers: [{provide: DatabaseService, useClass: JDBCService}] 
}) 
export class CmpAComponent { 
    constructor (private databaseService: DatabaseService) { 
     console.log("Database implementation in CompA :"+this.databaseService.getService()); 
    } 
} 

लेकिन इस कार्यान्वयन के साथ समस्या यह HibernateService और JDBCService अब किसी अन्य वर्ग का विस्तार करने में सक्षम नहीं हैं ।

class A{ 
    constructor(){ 
     console.log("in A"); 
    } 
} 
class B extends A{ 
    constructor(){ 
     super(); 
     console.log("in B"); 
    } 
} 
class C extends A{ 
    constructor(){ 
     super(); 
     console.log("in C"); 
    } 
} 
let c = new C(); 

//This thing is not possible in typescript 
class D extends B, C{//error: Classes can only extend a single class 
    constructor(){ 
     super();// which constructor B or C 
     console.log("in D"); 
    } 
} 

आप डि के लिए इस पद्धति का उपयोग कर रहे हैं, तो यह सुनिश्चित कर लें कि आपके बच्चे स्तरीय सेवाएं भविष्य में किसी भी अन्य कार्यक्षमता बढ़ाने के लिए नहीं जा रहे हैं।

संबंधित मुद्दे