2016-03-23 33 views
6

özelliklerinde typescript 2.0 sınıf özelliklerini destekleyeceğini fark ettim, ancak henüz kullanılabilir değil. Bu yazının sebebi, bugün kodumu nasıl yazdığım konusunda akıllı olmak istiyorum ki, sonradan en az acı ile geçiş yapabilirim.typescript readonly sınıfı

Ben bu şekilde salt okunur özelliklere sahip bir sınıf kullanmak istiyorum:

let widget = new Widget(110, 220); // width, height 
//... 
widget.width(200); // to modify the width, I use a setter with validation 
widget.width = 300; // note: I want this to be a compile time error 
//... 
let w = widget.width; // and later I want to get/draw the current width 

... ama bunun nedeni fn ve mal aynı adı taşıyan için çalışmak alınamıyor - ben geçiş yaparız fW adı setWidth. Ben tüm readonly özellikleriyle önek eklememeyi tercih ederim çünkü geçmişte, acının ekstra karakteri anahtarlama zahmetinden daha fazlası olduğunu keşfettim. Ve TS'nin tip kontrolü nedeniyle, mülkün salt okunur (veya özel) olduğuna dair görsel hatırlatmaya ihtiyacım yok.

S1: Genişlik, Widget sınıfının aşağıdaki gibi bir salt okunur özelliğiyse, yukarıdaki yazı tipinde çalışır mı? Ben doğrudan özelliğini ayarlayın olabilir 'risk' ile doğrudan erişebilmesi için yakın vadede

export class widget { 
    readonly width:number; // doesn't work in TS 1.8 

    setWidth(w:number) { 
     this.width = w; 
    } 
} 

, ben mülkiyet genel yapabilirsiniz ya - ya da ben özel özelliklere sahip ve alıcıları ve ayarlayıcıları yazabilir.

S2: Sonuncuyu yaparsam, doğrudan özellik başvurusundan alıcı ne kadar yavaş? Sürüklenirken bazı özelliklerim çok sık çağrılacak, bu nedenle hız önemlidir.

widget.getWidth(); 
// vs 
widget.width; 

Geçenlerde this posted answer bulundu ve zaten TS benim yapmaya çalıştığım şeyin en destekler fark

GÜNCELLEME:

export class Widget { 
    private _width:number; 
    set width(w) {if (w >= 0) this._width = w} 
    get width() {return this._width} 
} 

Kullanım sözdizimi kamu malı aynıdır hiçbir çekici olmayan, gerçekten çekici olan:

let widget = new Widget(...); 
let existingWidth = widget.width; 
widget.width = newWidth; 

TS2'nin salt okunur niteleyicisinin, (özel) özelliklere (bir erişim işleviyle değil, daha hızlı) doğrudan okuma erişimi vereceğini ve kullanım kodumun hiçbirinin değiştirilmesinin gerekeceğini umuyorum. Herkes biliyor mu?

+0

Özellik erişimciler 20 kat daha yavaş olabilir ve performans çok tarayıcıya bağlıdır. Aşağıdaki jsPerf'e bakın - https://jsperf.com/data-vs-accessor-vs-getter-setter/2 – bnieland

+0

Bu jsperf'i (en son sürümü) çalıştırdım ve işlemler/sn sayıları gerçekçi olmayan şekilde yüksek görünüyor. Bana, makinemdeki Firefox'un 1 nanosaniyeden daha az bir sürede getter işlevini çalıştırdığını söylüyor. Mac'inin 4 çekirdeğini otomatik olarak yaymadığı sürece mümkün görünmüyor - bu durumda, gerçekte hala gerçekçi olmayan 4-5 nanosaniye civarında. – bedouger

+0

Eh, kendi testinizi yazmak için yeterince kolaydır. Bir mülk alıcısı kullanarak 100.000 zaman veri değerine erişmek ne kadar sürer? – bnieland

cevap

6

Şimdi, TS2'yi kullanıyorum, salt okunur kısıtlamanın sınıf içinde bile geçerli olduğu için, tam olarak ne istediğimin olmadığını buldum. Bu yüzden en iyisi, özel değiştiriciyi kullanmak ve açık bir getter yöntemi yazmak. Bu 2 nedenden dolayı talihsiz bir durumdur: okuma hızı (muhtemelen) ve getter metodu adı özel değişkenin isminden farklı olmalıdır.

+0

işlevini çalıştırmazsa, yapıcı dışındaki okuma değerlerini başlatmanın bir yolu yoktur. C# myThing = yeni Thing() {param = val, param2 = val2} var ama bence henüz yazı yok. –

+0

Endişe için belirli nedenleriniz olmadıkça erişim hızını düşünmüyorum. Adlandırmaya gelince, getter için 'property_name' ve private değişkeni için '_property_name' kullanın. Özel üyeler için önde gelen alt yazı çoğu dilde iyi bilinen bir konudur. – Neutrino