ইন্টারফেস সংজ্ঞায় গেটার / সেটার ব্যবহার করা কি সম্ভব?


94

এই মুহুর্তে, 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;
}

ইন্টারফেস সংজ্ঞাতে আমি গেটর এবং সেটার ব্যবহার করতে পারি এমন অন্য কোনও উপায় আছে কি?

উত্তর:


128

আপনি ইন্টারফেসে সম্পত্তি নির্দিষ্ট করতে পারেন, তবে গেটারস এবং সেটটারগুলি ব্যবহার করা হচ্ছে কিনা তা আপনি প্রয়োগ করতে পারবেন না:

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';
}

4
আপনি =>এই name = (a: string) => this._name;জাতীয় ক্লাসের পদ্ধতিগুলি সংজ্ঞায়িত করতে ব্যবহার করতে পারেন : তবে আউটপুটে জেএস এর প্রোটোটাইপ অবজেক্টটি প্রসারিত করার পরিবর্তে শ্রেণি ফাংশনের অভ্যন্তরে সংজ্ঞায়িত করা হবে।
অরেড

এই স্ট্যাটিক পেতে properties সহযোগে কাজ বলে মনে হচ্ছে না: /
CervEd

47

অন্যান্য উত্তরগুলির পরিপূরক করতে, যদি আপনার ইচ্ছাটি 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

প্রথমত, টাইপসক্রিপ্টটি কেবলমাত্র ইকামাস্ক্রিপ্ট 5 লক্ষ্য করে যখন সংশ্লেষ সমর্থন করে getএবং এটি setঅর্জন করতে আপনাকে এর সাথে সংকলকটি কল করতে হবে

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 কনস্ট্রাক্টরে ।

সোহনি যেমন উল্লেখ করেছেন, ইন্টারফেসটি বাস্তবায়নের কোনও বিবরণ আড়াল করার কথা। আমার উদাহরণে, জাভা-স্টাইলের গেটর পদ্ধতিটির প্রয়োজনের জন্য আমি ইন্টারফেসটি বেছে নিয়েছি। যাইহোক, আপনি একটি সম্পত্তিও করতে পারেন এবং তারপরে শ্রেণিটি ইন্টারফেসটি কীভাবে প্রয়োগ করতে হয় তা সিদ্ধান্ত নিতে দিন।


4
আপনি টাইপস্ক্রিপ্টে getএবং setকীওয়ার্ডগুলি ব্যবহার করতে পারেন ।
ফেন্টন

ECMAScript 5 সমর্থনে একটি পার্শ্ব নোট - Object.definePropertyআইই 8 +, এফএফ 4 +, অপেরা 12+, ওয়েবকিট এবং সাফারিতে সমর্থিত। Github.com/kriskowal/es5-shim এ একটি ইসি 5 শিমও রয়েছে
ফেন্টন

-1

টাইপস্ক্রিপ্ট ৩.৪ ব্যবহার করে:

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

টাইপস্ক্রিপ্ট খেলার মাঠে উদাহরণ দেখুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.