2012-10-11 17 views
47

इस समय, TypeScript इंटरफेस में प्राप्त/सेट विधियों (एक्सेसर्स) का उपयोग करने की अनुमति नहीं देता है। उदाहरण के लिए:क्या इंटरफ़ेस परिभाषा में गेटर्स/सेटर्स का उपयोग करना संभव है?

interface I { 
     get name():string; 
} 

class C implements I { 
     get name():string { 
      return null; 
     } 
} 

इसके अलावा, टाइपप्रति की अनुमति नहीं है वर्ग के तरीकों में उपयोग सरणी समारोह अभिव्यक्ति: के लिए पूर्व .:

class C { 
    private _name:string; 

    get name():string => this._name; 
} 

क्या कोई अन्य रास्ता नहीं मैं सेटर पर एक गेटर का उपयोग करें और कर सकता है एक इंटरफ़ेस परिभाषा?

उत्तर

64

आप अंतरफलक पर संपत्ति निर्दिष्ट कर सकते हैं, लेकिन आप लागू नहीं कर सकते कि क्या getters और setters उपयोग किया जाता है, इस तरह:

interface IExample { 
    Name: string; 
} 

class Example implements IExample { 
    private _name: string = "Bob"; 

    public get Name() { 
     return this._name; 
    } 

    public set Name(value) { 
     this._name = value; 
    } 
} 

var example = new Example(); 
alert(example.Name); 

इस उदाहरण में, इंटरफ़ेस वर्ग के लिए मजबूर नहीं करता है का उपयोग करने के गेटर्स और सेटर्स, मैं इसके बजाय एक संपत्ति का उपयोग कर सकता था (नीचे उदाहरण) - लेकिन इंटरफ़ेस को इन कार्यान्वयन विवरणों को छिपाने के लिए माना जाता है क्योंकि यह कॉलिंग कोड का वादा है कि वह क्या कह सकता है।

interface IExample { 
    Name: string; 
} 

class Example implements IExample { 
    // this satisfies the interface just the same 
    public Name: string = "Bob"; 
} 

var example = new Example(); 
alert(example.Name); 

और अंत में, => वर्ग तरीकों के लिए अनुमति नहीं है - आप सकता है start a discussion on Codeplex अगर आपको लगता है इसके लिए एक जल उपयोग के मामले है। यहाँ एक उदाहरण है:

class Test { 
    // Yes 
    getName =() => 'Steve'; 

    // No 
    getName() => 'Steve'; 

    // No 
    get name() => 'Steve'; 
} 
+0

पर ईसी 5 शिम भी है, आप इस तरह के वर्ग विधियों को परिभाषित करने के लिए '=>' का उपयोग कर सकते हैं: 'name = (a: string) => this._name;' लेकिन आउटपुट जेएस में इसे प्रोटोटाइप ऑब्जेक्ट को विस्तारित करने के बजाय क्लास फ़ंक्शन के अंदर परिभाषित किया जाएगा। – orad

3

सबसे पहले, टाइपप्रति केवल का समर्थन करता है get और set वाक्य रचना जब ECMAScript 5. लक्ष्यीकरण इस लक्ष्य को हासिल करने के लिए आपको

tsc --target ES5 

इंटरफेस के साथ संकलक कॉल करने के लिए getters और setters का समर्थन नहीं करते है। संकलित करने के लिए आप

interface I { 
    getName():string; 
} 

class C implements I { 
    getName():string { 
      return null; 
    } 
} 

क्या टाइपप्रति का समर्थन करता है के लिए इसे बदल करना होगा अपना कोड प्राप्त करने के लिए निर्माताओं में क्षेत्रों के लिए एक विशेष वाक्य रचना है। आपके मामले में, आप हो सकता था

interface I { 
    getName():string; 
} 

class C implements I { 
    constructor(public name: string) { 
    } 
    getName():string { 
     return name; 
    } 
} 

सूचना कैसे वर्ग C क्षेत्र name निर्दिष्ट नहीं है। यह वास्तव में निर्माता में सिंटेक्टिक चीनी public name: string का उपयोग करके घोषित किया जाता है।

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

+1

आप टाइपस्क्रिप्ट में 'get' और 'set' कीवर्ड का उपयोग कर सकते हैं। – Fenton

+0

धन्यवाद। मैंने अपना जवाब अपडेट कर लिया है। – Valentin

+0

ईसीएमएस्क्रिप्ट 5 समर्थन पर एक साइड नोट - 'ऑब्जेक्ट.डेफिनप्रोपर्टी' आईई 8 +, एफएफ 4 +, ओपेरा 12+, वेबकिट और सफारी में समर्थित है। Https://github.com/kriskowal/es5-shim – Fenton

14

अन्य उत्तर के पूरक करने के लिए, यदि अपनी इच्छा एक इंटरफेस पर एक get value परिभाषित करने के लिए है, तो आप ऐसा कर सकते हैं:

interface Foo { 
    readonly value: number; 
} 

let foo: Foo = { value: 10 }; 

foo.value = 20; //error 

class Bar implements Foo { 
    get value() { 
    return 10; 
    } 
} 

लेकिन जहां तक ​​मुझे पता है कर रहा हूँ , और जैसा कि अन्य लोगों ने उल्लेख किया है, वर्तमान में इंटरफ़ेस में सेट-केवल संपत्ति को परिभाषित करने का कोई तरीका नहीं है। हालांकि, आप (केवल विकास चक्र के दौरान उपयोगी) एक रन-टाइम त्रुटि के लिए सीमा को स्थानांतरित कर सकते हैं:

interface Foo { 
    /* Set Only! */ 
    value: number; 
} 

class Bar implements Foo { 
    _value:number; 
    set value(value: number) { 
    this._value = value; 
    } 
    get value() { 
    throw Error("Not Supported Exception"); 
    } 
} 

अनुशंसित नहीं अभ्यास; लेकिन एक विकल्प।

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

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