2014-05-01 9 views
10

टाइपस्क्रिप्ट का मेरा स्तर 'ABSOLUTE BEGINNER' है लेकिन मेरे पास एक अच्छी ओओपी पृष्ठभूमि है। मैं निर्माण कर रहा हूँ टाइपप्रति के साथ एक संदर्भ है जो निम्न इंटरफ़ेस शामिल एक बाहरी t.ds पुस्तकालय:टाइपस्क्रिप्ट इंटरफ़ेस प्रारंभिक

interface ISimpleObject { 
    foo: string; 
    bar?: any; 
} 

अब, अगर मैं एक विधि एक IRequestConfig पैरामीटर है कि कॉल करना चाहते हैं, मैं कैसे एक बना सकता हूँ? मैं अलग-अलग विकल्प देख सकता हूं:

  1. ISimpleObject का एक सरल कार्यान्वयन बनाएं। मैं इस दृष्टिकोण पसंद नहीं है क्योंकि यह मेरे लिए बॉयलरप्लेट कोड की तरह दिखता है
  2. वस्तु (मुझे डर है यह कुछ टूट सकता ...) को प्रारंभ नहीं है:

    var x :IsimpleObject; x.bar = 'xxx'; callMethod(x);

  3. एक POJO कास्ट :

    var x :IsimpleObject = <IsimpleObject>{foo: 'yyy', bar:'xxx'};

    क्योंकि या तो यह प्रकार सुरक्षा लागू नहीं करता है मैं इस दृष्टिकोण पसंद नहीं है ...

मुझे लगता है कि यह एक काफी मामूली सवाल है और मुझे टाइपस्क्रिप्ट के बारे में कुछ मामूली याद आ रही है।

उत्तर

21

यदि आप एक इंटरफेस की तरह है:

interface ISimpleObject { 
    foo: string; 
    bar?: any; 
} 

इस इंटरफ़ेस केवल कोड-हिंट/IntelliSense के लिए संकलन समय पर प्रयोग किया जाता है। इंटरफ़ेस का उपयोग किसी ऑब्जेक्ट को एक निश्चित तरीके से परिभाषित हस्ताक्षर के साथ करने का कठोर और प्रकार-सुरक्षित तरीका प्रदान करने के लिए किया जाता है।

आप एक समारोह का उपयोग कर interface ऊपर परिभाषित है: यदि एक वस्तु ISimpleObject इंटरफ़ेस का सही हस्ताक्षर नहीं है

function start(config: ISimpleObject):void { 

} 

टाइपप्रति संकलन विफल हो जाएगा।

// matches the interface as there is a foo property 
start({foo: 'hello'}); 

// Type assertion -- intellisense will "know" that this is an ISimpleObject 
// but it's not necessary as shown above to assert the type 
var x = <ISimpleObject> { foo: 'hello' }; 
start(x); 

// the type was inferred by declaration of variable type 
var x : ISimpleObject = { foo: 'hello' }; 
start(x); 

// the signature matches ... intellisense won't treat the variable x 
// as anything but an object with a property of foo. 
var x = { foo: 'hello' }; 
start(x);  

// and a class option: 
class Simple implements ISimpleObject { 
    constructor (public foo: string, public bar?: any) { 
     // automatically creates properties for foo and bar 
    } 
} 
start(new Simple("hello")); 

किसी भी समय हस्ताक्षर से मेल नहीं खाता, संकलन विफल हो जाएगा:

// compile fail 
var bad = { foobar: 'bad' }; 
start(bad); 

// compile fail 
var bad: ISimpleObject = { foobar: 'bad' }; 

// and so on. 

कोई "सही" तरीका नहीं है

समारोह start फोन करने के लिए कई वैध तकनीक रहे हैं इसे करने के लिए। यह शैली पसंद का मामला है।यदि यह एक उद्देश्य यह है कि निर्माण किया गया था (बजाय बस सीधे एक पैरामीटर के रूप में पारित) थे, मैं सामान्य रूप से प्रकार की घोषणा करेंगे:

var config: ISimpleObject = { foo: 'hello' }; 

इस तरह कोड: पूर्ण करने/IntelliSense कहीं भी काम करेंगे मैं config चर प्रयोग किया है:

config.bar = { extra: '2014' }; 

टाइपस्क्रिप्ट में कोई "कास्टिंग" नहीं है। इसे एक प्रकार का दावा कहा जाता है और यहां वर्णित मामलों में इसकी आवश्यकता नहीं होनी चाहिए (मैंने ऊपर एक उदाहरण शामिल किया था जहां इसका उपयोग किया जा सकता था)। परिवर्तनीय प्रकार घोषित करने की कोई आवश्यकता नहीं है और फिर इस मामले में एक दावा का उपयोग करें (जैसा कि प्रकार पहले से ज्ञात था)।

+0

मेरी इच्छा है कि मेरे पास और अधिक उत्थान हो! – mentat

1
  • आप इंटरफ़ेस का उदाहरण नहीं बना सकते हैं क्योंकि टाइपस्क्रिप्ट इसे "अनुवाद" नहीं करता है। आप बनाए गए जेएस की जांच कर सकते हैं और आप इसमें कुछ भी नहीं देखेंगे। यह संकलन त्रुटियों, प्रकार सुरक्षा और इंटेलिजेंस के लिए आसान है।

    interface IStackOverFlow 
    { 
        prop1 : string; 
        prop2 : number; 
    } 
    
    public MyFunc(obj : IStackOverFlow) 
    { 
        // do stuff 
    } 
    
    var obj = {prop1: 'str', prop2: 3}; 
    MyFunc(obj); // ok 
    
    var obj2 = {prop1: 'str'}; 
    MyFunc(obj); // error, you are missing prop2 
    
    // getObj returns a "any" type but you can cast it to IStackOverFlow. 
    // This is just an example. 
    var obj = <IStackOverFlow> getObj(); 
    
+0

तो सही दृष्टिकोण पहले एक है? –

+1

यह इस बात पर निर्भर करता है कि आपको क्या करना है। चूंकि आप एक इंटरफ़ेस "नया" नहीं कर सकते हैं, इसलिए आप केवल पॉको डाल सकते हैं और टाइपस्क्रिप्ट कंपाइलर को देख सकते हैं कि आप सही काम कर रहे हैं .. –

+0

pojos के साथ समस्या यह है कि संकलक मुझे नहीं बताता है कि पैरामीटर सही हैं, इसलिए यदि मैं 'foo' के बजाय 'fooo' लिखता हूं मुझे कोई चेतावनी नहीं मिलती है। क्या मैं सही हूँ? –

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