পেতে এবং টাইপস্ক্রিপ্ট সেট


656

আমি একটি সম্পত্তি পেতে এবং সেট পদ্ধতি তৈরি করার চেষ্টা করছি:

private _name: string;

Name() {
    get:
    {
        return this._name;
    }
    set:
    {
        this._name = ???;
    }
}

একটি মান সেট করার মূল শব্দটি কী?


12
টাইপসক্রিপ্ট কোডিং গাইডলাইনগুলির সাথে আন্ডারস্কোর এবং পাস্কেলকেস দ্বন্দ্ব রয়েছে: github.com/Mic
নিলস স্টেইনবিক

2
হাই @ নিলসটেনবিট - বৈশিষ্ট্য এবং ব্যাকিং ফিল্ডগুলির সাথে টাইপস্ক্রিপ্ট অবদানকারীদের নির্দেশিকা অনুসরণ করে আপনি একটি নাম দ্বন্দ্বের সাথে শেষ করতে চান। প্রস্তাবিত পদ্ধতির কী?
জর্ডান

সম্ভবত: typescript private name: string; getName() { get: { return this.name; } set: { this.name = ???; } }
জর্ডান

7
ভালো কথা those টাইপস্ক্রিপ্ট কোডিং গাইডলাইনগুলি বেশ আনট্রেসিভ। আমি কেবল তাদের জবরদস্তিতে ব্যবহার করব (উদাহরণস্বরূপ আমাকে এটি করার জন্য অর্থ প্রদান করা হয়েছিল)।
থমাস এডিং

14
@ নিলসটেনবিট: আপনি কি এই নথিটি পড়েছেন? "এটি টাইপস্ক্রিপ্ট সম্প্রদায়ের জন্য কোনও নির্দেশমূলক নির্দেশিকা নয়"
জনাথন কাস্ট

উত্তর:


1080

টাইপসক্রিপ্টটি গিটার / সেটার সিনট্যাক্স ব্যবহার করে যা অ্যাকশনস্ক্রিপ্ট 3 এর মতো।

class foo {
    private _bar: boolean = false;
    get bar(): boolean {
        return this._bar;
    }
    set bar(value: boolean) {
        this._bar = value;
    }
}

এটি ECMAScript 5 Object.defineProperty()বৈশিষ্ট্যটি ব্যবহার করে এই জাভাস্ক্রিপ্ট তৈরি করবে ।

var foo = (function () {
    function foo() {
        this._bar = false;
    }
    Object.defineProperty(foo.prototype, "bar", {
        get: function () {
            return this._bar;
        },
        set: function (value) {
            this._bar = value;
        },
        enumerable: true,
        configurable: true
    });
    return foo;
})();

সুতরাং এটি ব্যবহার করতে,

var myFoo = new foo();
if(myFoo.bar) {         // calls the getter
    myFoo.bar = false;  // calls the setter and passes false
}

তবে এটিকে একেবারে ব্যবহার করার জন্য, আপনাকে অবশ্যই টাইপস্ক্রিপ্ট সংকলক ECMAScript5 লক্ষ্য করে তা নিশ্চিত করতে হবে। আপনি যদি কমান্ড লাইন সংকলকটি চালাচ্ছেন তবে --targetএই জাতীয় পতাকা ব্যবহার করুন ;

tsc --target ES5

আপনি যদি ভিজ্যুয়াল স্টুডিও ব্যবহার করছেন তবে আপনার টাইপস্ক্রিপ্টকম্পাইল বিল্ড সরঞ্জামটির কনফিগারেশনে পতাকাটি যুক্ত করতে আপনার প্রকল্প ফাইলটি সম্পাদনা করতে হবে। আপনি এটি এখানে দেখতে পারেন :

@ ড্যানফ্রমগ্রামী নীচের পরামর্শ অনুসারে, আপনার যদি কেবল স্থানীয় সম্পত্তি যেমন পড়া এবং লেখার মতো হয় foo.bar = true, তবে সেটার এবং গিটারের জুটি থাকা খুব বেশি ব্যয়বহুল। সম্পত্তি পড়া বা লিখিত হওয়ার পরে লগিংয়ের মতো কিছু করার দরকার থাকলে আপনি সেগুলি পরে যুক্ত করতে পারেন।


59
চমৎকার উত্তর. এছাড়াও, নোট করুন, সি # এর বিপরীতে বৈশিষ্ট্যগুলি বর্তমানে টাইপস্ক্রিপ্টে (ভার্চুয়ালাইজড) নয় (v0.9.5)। যখন আপনি একটি উত্পন্ন ক্লাসে "get বার ()" প্রয়োগ করেন, আপনি পিতামাতার মধ্যে "get get বার ()" প্রতিস্থাপন করছেন। প্রভাবগুলি হ'ল উদ্ভূত অ্যাকসেসর থেকে বেস বর্গ অ্যাক্সেসর কল করতে সক্ষম না হওয়া অন্তর্ভুক্ত। এটি কেবল বৈশিষ্ট্যগুলির ক্ষেত্রেই সত্য - পদ্ধতিগুলি আপনার প্রত্যাশা মতো আচরণ করে। : এখানে SteveFenton দ্বারা উত্তর দেখার stackoverflow.com/questions/13121431/...
ডেভিড Cuccia

14
আন্ডারস্কোর সম্পর্কে আমি কিছুটা বিভ্রান্ত। টাইপস্ক্রিপ্ট কনভেনশন বলে যে ব্যক্তিগত ভেরিয়েবলগুলির জন্য আন্ডারস্কোর ব্যবহার করবেন না? তবে এই ক্ষেত্রে, আমাদের আন্ডারস্কোরগুলি ব্যবহার করতে হবে - বা আমরা বেসরকারী এবং পাবলিক "বার"
কোকোডোকো

4
আন্ডারস্কোরটি ব্যক্তিগত সম্পত্তি হিসাবে ব্যক্তিগত পছন্দ pre যাইহোক, আমি বিশ্বাস করি আপনি ঠিকই আছেন যে আমরা গেটর / সেটার পদ্ধতির চেয়ে সম্পত্তিটির আলাদা নাম রাখতে চাই।
এজওয়ার্ড

3
আপনি এর myFoo.bar = trueপরিবর্তে myFoo.bar(true);বা কেন ব্যবহার করবেন myFoo.setBar(true);??
ড্যানিয়েল ডাব্লু।

6
@ ড্যানফ্রমগ্রামী একটি জুটি "গেট" এবং "সেট" পদ্ধতির একটি জুটির জন্য "সিনট্যাকটিক চিনি"। মাইক্রোসফ্ট ভিজ্যুয়াল বেসিক দিয়ে একটি সম্পত্তি ধারণার সূচনা করেছিল এবং এটি সি # এবং ভিবি.এনইটের মতো .NET ভাষায় নিয়ে যায়। উদাহরণস্বরূপ, বৈশিষ্ট্য (সি # প্রোগ্রামিং গাইড) দেখুন । বৈশিষ্ট্যগুলি কোনও সামগ্রীর স্থিতি অ্যাক্সেসকে সহজ করে এবং (আমার মতে) "get / set" পদ্ধতির জোড়গুলির সাথে ডিল করার "শোরগোল" দূর করে। (বা কখনও কখনও কেবল "পান" পদ্ধতি যেখানে অপরিবর্তনীয়তা কাঙ্ক্ষিত হয়))
ডেভিডআরআর

112

এজওয়ার্ড ইতিমধ্যে একটি ভাল উত্তর সরবরাহ করেছে, কিন্তু আমি লক্ষ্য করেছি যে একটি মন্তব্যে এটি কীভাবে ব্যবহৃত হয় তা জিজ্ঞাসা করে। আমার মতো লোকেরা যারা এই প্রশ্নটি দেখে হোঁচট খায়, আমি ভেবেছিলাম টাইপসক্রিপ্ট ওয়েবসাইটে পাওয়া গেস্টার এবং সেটটারদের অফিসিয়াল ডকুমেন্টেশনের একটি লিঙ্ক যুক্তিযুক্ত হবে যা এটি ভালভাবে ব্যাখ্যা করেছে, আশা করি যে পরিবর্তনগুলি সর্বদা আপ টু ডেট থাকবে তৈরি, এবং উদাহরণ ব্যবহার দেখায়:

http://www.typescriptlang.org/docs/handbook/classes.html

বিশেষত, যাঁরা এর সাথে পরিচিত নন, তাদের জন্য নোট করুন যে আপনি 'গেট' শব্দটি কোনও গেটের (এবং একইভাবে সেটটারদের জন্য) একটি কলকে অন্তর্ভুক্ত করেন না:

var myBar = myFoo.getBar(); // wrong    
var myBar = myFoo.get('bar');  // wrong

আপনার কেবল এটি করা উচিত:

var myBar = myFoo.bar;  // correct (get)
myFoo.bar = true;  // correct (set) (false is correct too obviously!)

যেমন একটি বর্গ দেওয়া:

class foo {
  private _bar:boolean = false;

  get bar():boolean {
    return this._bar;
  }
  set bar(theBar:boolean) {
    this._bar = theBar;
  }
}

তারপরে ব্যক্তিগত '_বার' সম্পত্তিটির জন্য 'বার' গ্রাহককে কল করা হবে।


আমি যদি কোনও সম্পত্তি সহ কোনও সার্বজনীন শ্রেণির স্তরের ভেরিট প্রতিস্থাপন করতে চাইছিলাম তবে এটি কি সরল ড্রপ-ইন প্রতিস্থাপন যা আমি স্থির করে রাখতে পারি এবং এটি নিয়ে চিন্তিত না? অন্য কথায়, যদি আমি একটি অ্যাক্সেসর এবং একটি সেটারের পরীক্ষা করি তবে আমি কি এটি একটি সাফল্য হিসাবে বিবেচনা করতে পারি? বা এমন কোনও ঘটনা রয়েছে যেখানে এটি কোনও ভেরির মতো ঠিক একই রকম কাজ করবে না এবং আমার এই সমস্ত ভার / প্রপ ব্যবহার করে এমন 100 টি স্থানের পরীক্ষা করা দরকার?
অ্যাডাম প্লোচার

আমি ভাবছিলাম যে গেটর বা সেটার পদ্ধতিগুলির থেকে সম্পত্তিটির নামটি আলাদা করার জন্য আন্ডারস্কোরগুলি ব্যবহারের জন্য কোনও কর্মপদ্ধতি আছে কিনা। একটি কোর্সে আমি করছিলাম তারা বলেছিল যে আন্ডারস্কোরগুলি পছন্দ করা হয়নি তবে বিকল্প দেওয়া হয়নি give
চাম

1
@ চ্যাম আপনাকে এখানে আন্ডারস্কোর ব্যবহার করতে হবে না ... আপনি চাইলে ব্যক্তিগত ভেরিয়েবল নোটবার কল করতে পারেন।
রবার্ট ম্যাককি

58

এখানে একটি কার্যকারী উদাহরণ যা আপনাকে সঠিক দিক নির্দেশ করবে:

class Foo {
    _name;

    get Name() {
        return this._name;
    }

    set Name(val) {
        this._name = val;
    }
}

জাভাস্ক্রিপ্টে যাত্রী এবং সেটটারগুলি কেবল সাধারণ ফাংশন। সেটারটি এমন একটি ফাংশন যা একটি পরামিতি নেয় যার মান সেট করা মান।


30
পরিষ্কার হতে হবে, সম্পত্তি, গেটর এবং সেটার হওয়ার দরকার নেই static
ড্র নোকস

1
পরিবর্তনশীল উল্লেখগুলি এখনও স্থির ic Foo._nameএর সাথে প্রতিস্থাপন করা উচিতthis._name
জোহানেস

6

আপনি এটি লিখতে পারেন

class Human {
    private firstName : string;
    private lastName : string;

    constructor (
        public FirstName?:string, 
        public LastName?:string) {

    }

    get FirstName() : string {
        console.log("Get FirstName : ", this.firstName);
        return this.firstName;
    }
    set FirstName(value : string) {
        console.log("Set FirstName : ", value);
        this.firstName = value;
    } 

    get LastName() : string {
        console.log("Get LastName : ", this.lastName);
        return this.lastName;
    }
    set LastName(value : string) {
        console.log("Set LastName : ", value);
        this.lastName = value;
    } 

}

2
কনস্ট্রাক্টরে পাবলিক কেন?
মুরিলোকুঞ্জ

17
হ্যাঁ, এই কোডটিতে কনস্ট্রাক্টরে সর্বজনীন থাকতে পারে না। publicএখানে সদৃশ সদস্যদের সংজ্ঞা দেয়।
ওরাড

2
আপনি এটি লিখতে পারেন তবে এটি সংকলন করবে না
জাস্টিন

3

টিএস গিটার এবং সেটারগুলি সরবরাহ করে যা বস্তুর বৈশিষ্ট্যগুলিকে কীভাবে অ্যাক্সেস করা হয় (গেটর) বা আপডেট (সেটার) অবজেক্টের বাইরে তার আরও নিয়ন্ত্রণ রাখতে দেয় । সরাসরি সম্পত্তি অ্যাক্সেস বা আপডেট করার পরিবর্তে একটি প্রক্সি ফাংশন বলা হয়।

উদাহরণ:

class Person {
    constructor(name: string) {
        this._name = name;
    }

    private _name: string;

    get name() {
        return this._name;
    }

    // first checks the length of the name and then updates the name.
    set name(name: string) {
        if (name.length > 10) {
            throw new Error("Name has a max length of 10");
        }

        this._name = name;  
    }

    doStuff () {
        this._name = 'foofooooooofoooo';
    }


}

const person = new Person('Willem');

// doesn't throw error, setter function not called within the object method when this._name is changed
person.doStuff();  

// throws error because setter is called and name is longer than 10 characters
person.name = 'barbarbarbarbarbar';  

1

এটি সাধারণ পদ্ধতি তৈরির সাথে খুব মিল, কেবল কীওয়ার্ডটি সংরক্ষিত getবা setশুরুতে রাখুন।

class Name{
    private _name: string;

    getMethod(): string{
        return this._name;
    }

    setMethod(value: string){
        this._name = value
    }

    get getMethod1(): string{
        return this._name;
    }

    set setMethod1(value: string){
        this._name = value
    }
}

class HelloWorld {

    public static main(){

        let test = new Name();

        test.setMethod('test.getMethod() --- need ()');
            console.log(test.getMethod());

        test.setMethod1 = 'test.getMethod1 --- no need (), and used = for set ';
            console.log(test.getMethod1);
    }
}
HelloWorld.main();

এই ক্ষেত্রে আপনি রিটার্ন টাইপ এড়িয়ে যেতে পারেন get getMethod1() {

    get getMethod1() {
        return this._name;
    }

1

আমি মনে করি কেন সম্ভবত এত বিভ্রান্তিকর আমি তা পেয়েছি। আপনার উদাহরণস্বরূপ, আমরা গেটার্স এবং সেটারগুলি চাইছিলাম _name। তবে আমরা এটি একটি সম্পর্কযুক্ত শ্রেণীর ভেরিয়েবলের জন্য গেটর এবং সেটটার তৈরি করে অর্জন করি Name

এই বিবেচনা:

class Car{
    private tiresCount = 4;
    get yourCarTiresCount(){
        return this.tiresCount ;
    }
    set yourCarTiresCount(count) {
        alert('You shouldn't change car tire count')
    }
}

উপরের কোডগুলি নিম্নলিখিতগুলি করে:

  1. getএবং এর setজন্য গেটর এবং সেটার তৈরি করুন yourCarTiresCount(এর জন্য নয়tiresCount )।

প্রাপ্তি হ'ল:

function() {
    return this.tiresCount ;
}

এবং সেটটারটি হ'ল:

function(count) {
    alert('You shouldn't change car tire count');
}

অর্থ, প্রতিবার আমরা করি new Car().yourCarTiresCount, গেটর রান করে। এবং প্রতিটি new Car().yourCarTiresCount('7')সেটার জন্য রান।

  1. অপ্রত্যক্ষভাবে গেটর তৈরি করুন, তবে সেটারটি নয়, ব্যক্তিগত জন্য tireCount

0

আপনি যদি কোনও অবজেক্টে (শ্রেণি নয়) সন্ধান এবং সেট করার উপায় সন্ধান করছেন তবে তা ব্যবহারযোগ্য Proxy হতে পারে: https://developer.mozilla.org/en-US/docs/Web/JavaScript/References/Global_Objects/Proxy

const target = {
  message1: "hello",
  message2: "everyone"
};

const handler3 = {
  get: function (target, prop, receiver) {
    if (prop === "message2") {
      return "world";
    }
    return Reflect.get(...arguments);
  },
};

const proxy3 = new Proxy(target, handler3);

console.log(proxy3.message1); // hello
console.log(proxy3.message2); // world

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


-6

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

// dataStore.ts
export const myData: string = undefined;  // just for typing support
let _myData: string;  // for memoizing the getter results

Object.defineProperty(this, "myData", {
    get: (): string => {
        if (_myData === undefined) {
            _myData = "my data";  // pretend this took a long time
        }

        return _myData;
    },
});

তারপরে, অন্য একটি ফাইলে আপনার কাছে রয়েছে:

import * as dataStore from "./dataStore"
console.log(dataStore.myData); // "my data"

8
এটা ভয়ানক পরামর্শ। বিশেষত, thisএকটি মডিউল শীর্ষ স্তরের স্কোপ এ অবশ্যই অপরিজ্ঞাত করা আবশ্যক। আপনি এর exportsপরিবর্তে ব্যবহার করতে পারেন তবে এটি একেবারেই করা উচিত নয় কারণ এটি সামঞ্জস্যতার সমস্যার কারণ হিসাবে কার্যত গ্যারান্টিযুক্ত
আলুয়ান হাদাদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.