almak ve daktilo set

oy
320

Bir özellik için alma ve kurma yöntemine oluşturmaya çalışıyorum:

private _name: string;

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

Bir değer ayarlamak için anahtar kelime nedir?

Oluştur 10/10/2012 saat 20:52
kaynak kullanıcı
Diğer dillerde...                            


8 cevaplar

oy
571

Typescript ActionScript3 gibidir alıcı / ayarlayıcı sözdizimi kullanır.

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

Yani ECMAScript 5 Object.defineProperty () özelliğini kullanarak, bu Javascript üretecek.

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

Yani kullanmak için,

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

Ancak, hiç kullanmak için, sen typescript derleyici hedefleri ECMAScript5'i emin olmalısınız. Eğer komut satırı derleyici çalıştırıyorsanız, böyle --target bayrağını kullanmak;

tsc --target ES5

Visual Studio kullanıyorsanız, sen TypeScriptCompile inşa aracı için yapılandırmaya bayrak eklemek için proje dosyasını düzenlemelisiniz. Bunu görebilirsiniz burada :

sadesin okuma ve gerçek foo.bar = gibi yerel bir özelliği yazma, daha sonra yaşıyorsanız @DanFromGermany, aşağıda da anlaşılacağı gibi bir ayarlayıcı ve alıcı çifti overkill. mülkiyet okuma veya yazma ne zaman, günlük gibi bir şey yapmak gerekiyorsa hep daha sonra ekleyebilirsiniz.

Cevap 12/10/2012 saat 01:19
kaynak kullanıcı

oy
47

Ezward zaten iyi bir cevap sağlamıştır ama yorumların biri nasıl kullanıldığını sorar fark ettim. Bu soruya rastlarsanız benim gibi insanlar için, ben, değişikliklerin olarak yukarı güncel umarım hep kalacak, yani iyice açıkladığı gibi typescript web sitesinde Alıcı ve ayarlayıcıların resmi belgelere bir bağlantı oluşturulması yararlı olacağını düşündüm yapılan ve örneğin kullanımını gösterir:

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

Özellikle, onunla aşina olmayan kişiler için, siz (belirleyiciler için benzer ve) bir gaz giderici bir çağrı içine 'get' kelimelerini içeren olmadığını unutmayın:

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

Basitçe, bu yapmalıdır:

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

Bir sınıf gibi verilen:

class foo {
  private _bar:boolean = false;

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

Daha sonra özel '_bar niteliğinin çubuğu' alıcı çağrılır.

Cevap 15/01/2016 saat 12:53
kaynak kullanıcı

oy
41

Burada doğru yönde işaret etmelidir çalışan bir örnek:

class Foo {
    _name;

    get Name() {
        return this._name;
    }

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

JavaScript Alıcılar ve ayarlayıcılar sadece normal fonksiyonları bulunmaktadır. ayarlayıcı değeri ayarlanan değer bir parametre alan bir fonksiyonudur.

Cevap 10/10/2012 saat 21:07
kaynak kullanıcı

oy
2

Bu ortak yöntemler oluşturarak çok benzer, sadece saklıdır anahtar koymak getveya setbaşında.

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

Bu durumda size dönüş türünü atlayabilirsiniz get getMethod1() {

    get getMethod1() {
        return this._name;
    }
Cevap 22/03/2016 saat 14:13
kaynak kullanıcı

oy
2

Bunu yazabilir

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

}
Cevap 11/10/2012 saat 19:32
kaynak kullanıcı

oy
0

TS Alıcılar ve nesne özellikleri onlar (alıcı) veya güncellenmiş (ayarlayıcı) erişilen nasıl daha fazla kontrol için izin ayarlayıcılar sunuyor dışında nesnenin. Yerine doğrudan erişen veya bir proxy işlevi denir özelliği güncellenmesi.

Örnek:

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';  
Cevap 11/07/2019 saat 17:53
kaynak kullanıcı

oy
0

Bu kadar kafa karıştırıcı neden muhtemelen olsun düşünüyorum. Senin Örneğimizde, alıcıları ve ayarlayıcıları için istediği _name. Ama biz alakasız bir sınıf değişkeni için Alıcılar ve ayarlayıcılar oluşturarak Bunu başarmak Name.

Bunu düşün:

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

Yukarıdaki kod şunları yapar:

  1. getve setiçin alıcı ve ayarlayıcı oluşturmak yourCarTiresCount( değiltiresCount ).

gaz gidericidir:

function() {
    return this.tiresCount ;
}

ve ayarlayıcı geçerli:

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

, Yaptığımız her zaman Anlamı new Car().yourCarTiresCount, alıcı çalışır. Ve her için new Car().yourCarTiresCount('7')ayarlayıcı ishal.

  1. Dolaylı özel için, pasör getter oluşturmak değil tireCount.
Cevap 13/10/2017 saat 19:11
kaynak kullanıcı

oy
-2

Eğer typescript modülleri ile çalışıyoruz ve ihraç edilmektedir bir alıcı eklemek için çalışıyorsanız, böyle bir şey yapabilirsiniz:

// 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;
    },
});

Sonra, başka bir dosyaya sahip olduğunuz:

import * as dataStore from "./dataStore"
console.log(dataStore.myData); // "my data"
Cevap 28/12/2017 saat 18:34
kaynak kullanıcı

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