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

वोट
50

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

interface I {
      get name():string;
}

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

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

class C {
    private _name:string;

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

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

11/10/2012 को 12:15
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


4 जवाब

वोट
68

आप अंतरफलक पर संपत्ति निर्दिष्ट कर सकते हैं, लेकिन आप लागू नहीं कर सकते कि क्या 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);

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

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

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

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

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

    // No
    get name() => 'Steve';
}
11/10/2012 को 13:03
का स्रोत उपयोगकर्ता

वोट
16

अन्य उत्तर के पूरक करने के लिए, यदि अपनी इच्छा एक परिभाषित करने के लिए है 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");
  }
}

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

13/12/2016 को 11:32
का स्रोत उपयोगकर्ता

वोट
2

सबसे पहले, टाइपप्रति केवल का समर्थन करता है 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निर्माता में।

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

11/10/2012 को 12:45
का स्रोत उपयोगकर्ता

वोट
0

टाइपप्रति 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());

पर उदाहरण देखें टाइपप्रति खेल का मैदान

25/05/2019 को 17:30
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more