Typescript özel üyeler

oy
76

Ben daktilo özel üyelerin uygulanması bakıyorum ve bunu biraz kafa karıştırıcı buluyorum. Intellisense özel üyeyi erişmesine izin vermez, ancak saf JavaScript, hepsi orada. Bu beni TS doğru özel üye uygulamıyor düşündürüyor. Düşüncesi olan var mı?

class Test{
  private member: any = private member;
}
alert(new Test().member);
Oluştur 03/10/2012 saat 18:24
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
68

Sadece tür denetleme olduğu gibi, üyelerin gizlilik sadece derleyici içinde uygulanır.

Bir özel mülkiyet düzenli özelliği olarak uygulanır ve sınıf dışındaki kod erişmek için izin verilmez.

Sınıf içinde gerçekten özel bir şey yapmak için, sınıfın üyesi olamaz, bu oluşturur kodundan içinde bir fonksiyon kapsamı içinde oluşturulan yerel bir değişken olacaktır. Yani kullandığınız yani sınıfın bir üyesi gibi erişemez anlamına geliyor thisanahtar kelimeyi.

Cevap 03/10/2012 saat 18:36
kaynak kullanıcı

oy
33

JavaScript özel değişkenleri destekler.

function MyClass() {
    var myPrivateVar = 3;

    this.doSomething = function() {
        return myPrivateVar++;        
    }
}

Daktilo bu yüzden gibi ifade edilir:

class MyClass {

    doSomething: () => number;

    constructor() {
        var myPrivateVar = 3;

        this.doSomething = function () {
            return myPrivateVar++;
        }
    }
}

DÜZENLE

Bu yaklaşım, sadece kullanılmalıdır idareli kesinlikle ihtiyaç duyulmaktadır. Örneğin geçici bir şifre önbelleğe gerekirse.

Orada (Javascript veya typescript alakasız) bu modeli kullanarak performans maliyetlerdir ve sadece kesinlikle gerekli kullanılmalıdır.

Cevap 06/06/2014 saat 17:01
kaynak kullanıcı

oy
11

Destek kez WeakMap daha yaygın olarak kullanılabilir örnek 3. ayrıntılarıyla ilginç bir tekniği var burada .

Tesis, özel veri sağlar VE veri prototip yöntemlerinin yerine Yalnızca örnek yöntemlerde erişilebilir olmasını sağlayarak Jason Evans örnek performans maliyetlerini ortadan kaldırır.

Chrome 36, Firefox 6.0, IE 11, Opera 23 ve Safari 7.1 bölümünde bağlantılı MDN WeakMap sayfa listeleri tarayıcı desteği.

let _counter = new WeakMap();
let _action = new WeakMap();
class Countdown {
  constructor(counter, action) {
    _counter.set(this, counter);
    _action.set(this, action);
  }
  decrement() {
    let counter = _counter.get(this);
    if (counter < 1) return;
    counter--;
    _counter.set(this, counter);
    if (counter === 0) {
      _action.get(this)();
    }
  }
}
Cevap 10/04/2016 saat 04:23
kaynak kullanıcı

oy
3

Bu konuda resmi tartışmaya bağlantıdan Sean Feldman sayesinde - bkz onun cevabını bağlantıdan.

Onun bağlantılı tartışma okuyun ve burada kilit noktaları özeti aşağıdadır:

  • Öneri: yapıcı özel özellikler
    • sorunları: Prototip işlevlerden erişemez
  • Öneri: yapıcı özel yöntemler
    • sorunlar: özelliklere sahip aynı, artı prototip sınıf başına bir kez bir işlev yaratma performans yararı kaybetmek; bunun yerine her örneği için fonksiyonun bir kopyasını oluşturmak
  • Öneri: soyut mülkiyet erişmek klişe ekleyip görünürlüğünü zorlamak
    • sorunları: ana performans havai; Typescript büyük uygulamalar için tasarlanmıştır
  • Öneri: typescript zaten kapatılmasıyla yapıcı ve prototip yöntemi tanımlarını sarar; Orada özel yöntemleri ve özellikleri koymak
    • Bu kapatma özel özelliklere koyarak ile ilgili sorunlar: statik değişkenler haline; Mesela başına bir yok
    • Bu kapatma özel yöntemler koyarak sorunları: onlar için erişimi olmayan thisgeçici çözüm çeşit olmadan
  • Öneri: otomatik olarak özel değişken isimleri bozmak
    • Sayaç argümanlar: bir adlandırma kuralı değil, bir dil bir yapı. Kendin bozmak
  • Öneri: özel yöntemler ek açıklama @privateetkin bir yöntem adlarını küçültmek anlamına ek açıklama tanımak böylece minifiers
    • Bu birine anlamlı sayaç argümanlar

Yayılan kodunda görünürlük desteği eklenmesinin Genel karşıt argümanlar:

  • Bu tutanak sorunu değil - Sorun JavaScript kendisi görünürlük değiştiriciler sahip olmamasıdır
  • JavaScript toplumda yerleşik bir desen zaten vardır: diyor bir alt çizgi ile önek özel özellikleri ve yöntemleri "Kendi risk devam et"
  • Typescript tasarımcıları gerçekten özel özellikleri ve yöntemleri "mümkün" olmadığını söyledi, onlar özellikle "tasarım kısıtlamaları altında mümkün değildir" demek:
    • Yayılan JS deyimseldir
    • Ortak metin minimumdur
    • Normal JS OOP kıyasla ek havai
Cevap 06/10/2016 saat 14:51
kaynak kullanıcı

oy
2

Daktilo Özel fonksiyonlar sınıf içinde erişilebilir. Sevmek

Burada görüntü açıklama girin

Özel bir üyesini erişmeye çalıştığınızda Ve bir hata gösterecektir. İşte örnek:

Burada görüntü açıklama girin

Not: JavaScript ile iyi olacak ve her iki işlev dışında erişilebilir.

Cevap 15/07/2016 saat 07:33
kaynak kullanıcı

oy
1

Bu eski bir tartışma olduğunu fark ama yine dışarı derlenmiş JavaScript ortak arabirim sınıfının içine "sızıntı" daktilo sözde özel değişkenler ve yöntemlerin sorunu yeniden benim çözüm paylaşmak için yararlı olabilir.

Hepsi bir örnek değişkeni DevTools'un görüntülendiğinde görsel dağınıklığı ilgili yani Bana göre bu mesele tamamen kozmetik olduğunu. Benim düzeltme daha sonra ana sınıfında örneği ve bir atanan başka bir sınıfın içine gruplandırmak özel bildirimleri etmektir privategibi bir adla (ama yine de JS herkese görünür) değişkenin __(çift alt çizgi).

Örnek:

class Privates {
    readonly DEFAULT_MULTIPLIER = 2;
    foo: number;
    bar: number;

    someMethod = (multiplier: number = this.DEFAULT_MULTIPLIER) => {
        return multiplier * (this.foo + this.bar);
    }

    private _class: MyClass;

    constructor(_class: MyClass) {
        this._class = _class;
    }
}

export class MyClass {
    private __: Privates = new Privates(this);

    constructor(foo: number, bar: number, baz: number) {
        // assign private property values...
        this.__.foo = foo;
        this.__.bar = bar;

        // assign public property values...
        this.baz = baz;
    }

    baz: number;

    print = () => {
        console.log(`foo=${this.__.foo}, bar=${this.__.bar}`);
        console.log(`someMethod returns ${this.__.someMethod()}`);
    }
}

let myClass = new MyClass(1, 2, 3);

Ne zaman myClassörnek bunları düzgünce daraltılmış içinde gruplandırılan bkz yerine (düzgün refactored gerçek yaşam kodunda çok görsel dağınık alabilirsiniz) gerçekten kamu olanlarla karışmış tüm "özel" üyeleri görme, DevTools'un görüntülendiğinde __mülkiyet:

Burada görüntü açıklama girin

Cevap 14/09/2018 saat 22:12
kaynak kullanıcı

oy
0

Birçok kişi bu çünkü JavaScript sınırlamaları mümkün değildir iddia ediyor. Ben JavaScript geliştiricilerin yaratıcılık sınırlarını olduğunu söyleyebilirim.

Ben vs., yani özel ve korunan kalıtımsal sınıfların üyeleri, hem de arayüzleri verir şu anda bir kütüphane gelişmekte ClassJS da derler. Burada Şuna bak GitHub'dan .

Cevap 12/04/2017 saat 01:06
kaynak kullanıcı

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