Kullanım örnekleri: #
-Özel alanlar
Önsöz:
Derleme zamanı ve çalışma zamanı gizliliği
#
-özel alanlar derleme zamanı ve çalışma zamanı gizliliği sağlar, bu da "hacklenemez". Bir üyeye sınıf gövdesinin dışından herhangi bir şekilde doğrudan erişimi engelleyen bir mekanizmadır .
class A {
#a: number;
constructor(a: number) {
this.#a = a;
}
}
let foo: A = new A(42);
foo.#a; // error, not allowed outside class bodies
(foo as any).#bar; // still nope.
Güvenli sınıf mirası
#
-Özel alanlar benzersiz bir kapsam alır. Sınıf hiyerarşileri, eşit adlara sahip özel mülklerin üzerine yazılmasına gerek kalmadan uygulanabilir.
class A {
#a = "a";
fnA() { return this.#a; }
}
class B extends A {
#a = "b";
fnB() { return this.#a; }
}
const b = new B();
b.fnA(); // returns "a" ; unique property #a in A is still retained
b.fnB(); // returns "b"
TS derleyici, private
özelliklerin üzerine yazılma tehlikesi olduğunda neyse ki bir hata yayar ( bu örneğe bakın ). Ancak derleme zamanı özelliğinin doğası gereği, derleme hataları göz ardı edildiğinde ve / veya yayılan JS kodu kullanıldığında, çalışma zamanında her şey hala mümkündür.
Harici kütüphaneler
Kütüphane yazarları, #
istemcilerde bir değişikliğe neden olmadan özel tanımlayıcıları yeniden düzenleyebilir. Diğer taraftaki kütüphane kullanıcıları dahili alanlara erişimden korunur.
JS API #
- özel alanları atlar
Yerleşik JS işlevleri ve yöntemleri #
-grivate alanları yok sayar. Bu, çalışma zamanında daha öngörülebilir bir özellik seçimine neden olabilir. Örnekler: Object.keys
, Object.entries
, JSON.stringify
, for..in
döngü ve diğerleri ( kod örneği ; ayrıca Matt Bierner görelim cevabı ):
class Foo {
#bar = 42;
baz = "huhu";
}
Object.keys(new Foo()); // [ "baz" ]
Kullanım örnekleri: private
anahtar kelime
Önsöz:
Dahili sınıf API'sına ve durumuna erişim (yalnızca derleme zamanı gizliliği)
private
bir sınıfın üyeleri çalışma zamanında geleneksel özelliklerdir. Bu esnekliği sınıf dahili API'sine veya durumuna dışarıdan erişmek için kullanabiliriz. Derleyici kontrollerini sağlamak için, tür iddiaları, dinamik özellik erişimi gibi mekanizmalar veya @ts-ignore
diğerleri arasında kullanılabilir.
Tür onaylı ( as
/ <>
) ve any
yazılan değişken atamalı örnek:
class A {
constructor(private a: number) { }
}
const a = new A(10);
a.a; // TS compile error
(a as any).a; // works
const casted: any = a; casted.a // works
TS private
, kaçış kapağı olan bir üyenin dinamik mülk erişimine bile izin verir :
class C {
private foo = 10;
}
const res = new C()["foo"]; // 10, res has type number
Özel erişim nerede mantıklı olabilir? (1) birim testleri, (2) hata ayıklama / günlüğe kaydetme durumları veya (3) proje iç sınıflarıyla birlikte diğer ileri durum senaryoları (açık uçlu liste).
İç değişkenlere erişim biraz çelişkilidir - aksi takdirde onları private
ilk etapta yapmazdınız . Bir örnek vermek gerekirse, birim testlerin, özel alanların uygulama ayrıntısı olarak gizlendiği siyah / gri kutular olması gerekir. Ancak pratikte, durumdan duruma doğru geçerli yaklaşımlar olabilir.
Tüm ES ortamlarında kullanılabilir
TS private
değiştiricileri tüm ES hedefleriyle kullanılabilir. #
-Özel alanlar yalnızca target
ES2015
/ ES6
veya üstü için kullanılabilir . ES6 + ' WeakMap
da dahili olarak alt düzey uygulama olarak kullanılır ( buraya bakın ). Yerel #
-özel alanlar şu anda zorunludur target
esnext
.
Tutarlılık ve uyumluluk
Ekipler private
, tek erişim değiştirici olarak kullanımını zorlamak için kodlama yönergelerini ve linter kurallarını kullanabilir . Bu kısıtlama, tutarlılığa yardımcı olabilir ve #
-grivate alan notasyonu ile geriye dönük uyumlu bir şekilde karışıklığı önleyebilir .
Gerekirse, parametre özellikleri (yapıcı ataması kısayolu) bir gösteri durdurucusudur. Yalnızca private
anahtar kelime ile kullanılabilirler ve bunları -gizli alanlar için uygulamak için henüz bir plan yoktur#
.
Diğer sebepler
private
bazı dengeleme durumlarında daha iyi çalışma zamanı performansı sağlayabilir ( buraya bakın ).
- TS'de şu ana kadar zor özel sınıf yöntemleri mevcut değil.
- Bazı insanlar
private
gösterim daha iyi anahtar kelime 😊.
İkisine de not
Her iki yaklaşım da derleme zamanında bir tür nominal veya markalı tür oluşturur.
class A1 { private a = 0; }
class A2 { private a = 42; }
const a: A1 = new A2();
// error: "separate declarations of a private property 'a'"
// same with hard private fields
Ayrıca, her ikisi de çapraz örnek erişimine izin verir: sınıf örneği A
diğer A
örneklerin özel üyelerine erişebilir :
class A {
private a = 0;
method(arg: A) {
console.log(arg.a); // works
}
}
Kaynaklar