क्या इंटरफ़ेस परिभाषा में गेटर्स / सेटर का उपयोग करना संभव है?


93

फिलहाल, 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;
}

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

जवाबों:


126

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

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);

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

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

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

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

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

यह स्थिर गुण के साथ काम करने के लिए प्रतीत नहीं होता है: /
CervEd

46

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

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");
  }
}

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


2

सबसे पहले, टाइपस्क्रिप्ट केवल सपोर्ट करता है getऔर setजब सिनेमैक्स 5 को लक्षित करता है तो सिंटैक्स। इसे प्राप्त करने के लिए, आपको कंपाइलर को कॉल करना होगा

tsc --target ES5

इंटरफेस गेटर्स और सेटर का समर्थन नहीं करते हैं। संकलन करने के लिए अपना कोड प्राप्त करने के लिए आपको इसे बदलना होगा

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टाइपप्रति में कीवर्ड।
फेंटन

ECMAScript 5 सपोर्ट पर एक साइड नोट - Object.definePropertyIE8 +, FF4 +, Opera 12+, WebKit और Safari में समर्थित है। वहाँ भी एक EC5 शिम है github.com/kriskowal/es5-shim
फेंटन

-1

टाइपस्क्रिप्ट 3.4 का उपयोग करना:

interface IPart {
    getQuantity(): number;
}

class Part implements IPart {
    private quantity: number;
    constructor(quantity: number) {
        this.quantity = quantity;
    }
    public getQuantity = (): number => {
        return this.quantity;
    };
}

let part = new Part(42);

// When used in typescript, quantity is not accessible.
// However, when compiled to javascript it will log '42'.
console.log(part.quantity);

// Logs '42'.
console.log(part.getQuantity());

टाइपस्क्रिप्ट प्लेग्राउंड पर उदाहरण देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.