ö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?
Ö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
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
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