2014-10-03 6 views
7

हम अपने वर्गों में से एक में एक विशिष्ट गेटर है इसके साथ काम करने के लिए मान लीजिए किबिना सेटर के संपत्ति के लिए टाइपस्क्रिप्ट इंटरफेस हस्ताक्षर।

class Employee implements IEmployee { 
    private _fullName: string; 

    get fullName(): string { 
     return this._fullName; 
    } 
} 

और एक अंतरफलक

interface IEmployee{ 
    fullName: string; 
} 

जब यह इंटरफ़ेस के माध्यम से एक उदाहरण के साथ काम संकलक हमें चेतावनी नहीं होगा अगर हम पूर्ण नाम को असाइन करने का प्रयास करते हैं तो एक सेटर की अनुपस्थिति के बारे में, और जेएस रनटाइम बस किसी असाइनमेंट को निगलता है और कोई त्रुटि नहीं फेंकता है। क्या इंटरफ़ेस सदस्य को केवल गेटर या केवल सेटटर के रूप में चिह्नित करने का कोई तरीका है?

मैंने this post देखा है, लेकिन यह काफी पुराना है, मैं जानना चाहता हूं, अगर कुछ भी सुधार हुआ है।

+0

इस प्रश्न के लिए गतिविधि की कमी पर वास्तव में आश्चर्यचकित हुआ। केवल गुण पढ़ें अविश्वसनीय रूप से उपयोगी हैं और टाइपस्क्रिप्ट में लागू करने वाले पहले पैटर्न में से एक है। – gravidThoughts

उत्तर

1

यह एक दिलचस्प सवाल है। एक पठनीय संपत्ति की अवधारणा टाइपस्क्रिप्ट में अन्य भाषाओं में काफी अलग है।

कई भाषाओं में एक गेटर (लेकिन कोई सेटरर) वाली संपत्ति एक कंपाइलर त्रुटि नहीं उठाएगी यदि आपने संपत्ति सेट करने का प्रयास किया है, लेकिन टाइपस्क्रिप्ट नहीं करता है।

संपत्ति अभी भी पढ़ी गई है, क्योंकि यदि आप इसे सेट करने का प्रयास करते हैं तो इससे कोई फर्क नहीं पड़ता; सेट चुपचाप विफल हो जाएगा।

class Example { 
    get name() { 
     return 'Steve'; 
    } 
} 

var y = new Example(); 
y.name = 'Example 2'; 
alert(y.name); 

जब मैं x.name = 'Example 2'; का उपयोग कोई संकलक चेतावनी है:

यहाँ किसी भी इंटरफेस के बिना एक उदाहरण है।

यदि एक कंपाइलर चेतावनी था, तो मैं बाद में एक इंटरफ़ेस के भीतर किसी संपत्ति के रीडोनली-नेस को निर्दिष्ट करने का एक तरीका होने की अपेक्षा करता हूं। जैसा कि आप उम्मीद करेंगे, उपरोक्त जानकारी दी गई है, आप एक इंटरफेस पर एक पठनीय संपत्ति सेट नहीं कर सकते हैं।

interface Test { 
    name: string; 
} 

class Example { 
    get name() { 
     return 'Steve'; 
    } 
} 

var x: Test = new Example(); 
x.name = 'Example 1'; 
alert(x.name); 

var y = new Example(); 
x.name = 'Example 2'; 
alert(x.name); 

इसका मतलब यह है कि आप केवल एक विधि होने संपत्ति (और स्पष्ट रूप से कोई तरीका यह सेट करने देती है) का मूल्य प्राप्त करने के द्वारा केवल पढ़ने के लिए सत्ता लागू कर सकते हैं।

interface Test { 
    getName:() => string; 
} 

class Example { 
    getName() { 
     return 'Steve'; 
    } 
} 

var x: Test = new Example(); 
//x.getName('Obviously not'); 
//x.getName() = 'Obviously not'; 
alert(x.getName()); 

var y = new Example(); 
//y.getName('Obviously not'); 
//y.getName() = 'Obviously not'; 
alert(y.getName()); 
+0

एक सेटटर की अनुपस्थिति में जेएस व्यवहार द्वारा रीडोनलिनेस पहले से ही काफी लागू है। समस्या इसकी मूक प्रकृति है - चुपचाप मूल्य निगल रहा है। आदर्श (और उम्मीद है कि आने वाला) समाधान टीएस इंटरफ़ेस सदस्यों को केवल गेटर \ सेटर के रूप में चिह्नित करने की अनुमति देगा। वैकल्पिक होने के कारण वैकल्पिक गेटर सेटर उत्पन्न करने के लिए वैकल्पिक होगा, जो केवल एक त्रुटि फेंक देगा (कम से कम एक सेटटर के लिए यह हमारी पूरी टीम की अपेक्षा है)। अंतिम थकाऊ समाधान हमेशा एक फेंकने वाला सेटर हाथ से बनाना होगा यदि कोई वास्तविक सेटटर की आवश्यकता नहीं है। –

+0

'एक सेटटर की अनुपस्थिति में जेएस व्यवहार द्वारा रीडोनियलिटी पहले से ही काफी लागू है।' हाँ - हालांकि "लागू" द्वारा, मैं एक कंपाइलर चेतावनी, squiggly लाल रेखाओं और कुछ प्रकार के श्रव्य अलार्म के बारे में और बात कर रहा था। उदाहरण कोड सेट प्रयास के चुपके को छोड़ देता है। इस बीच, संपत्ति पहुंच के लिए एक विधि का उपयोग करना संकलन समय गारंटी प्राप्त करने का एकमात्र तरीका है कि कोई भी सेट प्रयास करने का प्रयास नहीं किया जा रहा है। – Fenton

+0

इस समस्या के बारे में गिटहब पर एक मुद्दा बनाया https://github.com/Microsoft/TypeScript/issues/814 –

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