बक्सों का इस्तेमाल करें: #
-प्राकृतिक क्षेत्र
प्रस्तावना:
संकलन-समय और रन-टाइम गोपनीयता
#
-प्राकृतिक क्षेत्र संकलन-समय और रन-टाइम गोपनीयता प्रदान करते हैं , जो "हैक करने योग्य" नहीं है। यह किसी भी प्रत्यक्ष तरीके से वर्ग निकाय के बाहर के सदस्य तक पहुंच को रोकने के लिए एक तंत्र है ।
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.
सुरक्षित वर्ग विरासत
#
-प्राकृतिक क्षेत्रों को एक अद्वितीय गुंजाइश मिलती है। समान गुणों वाले निजी संपत्तियों के आकस्मिक ओवरराइट के बिना वर्ग पदानुक्रम को लागू किया जा सकता है।
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"
टीएस संकलक सौभाग्य से एक त्रुटि का उत्सर्जन करता है, जब private
गुण अधिलेखित होने का खतरा होता है ( इस उदाहरण को देखें )। लेकिन संकलन-समय सुविधा की प्रकृति के कारण, रन-टाइम पर सब कुछ अभी भी संभव है, दी गई संकलन त्रुटियों को अनदेखा किया जाता है और / या उत्सर्जित JS कोड का उपयोग किया जाता है।
बाहरी पुस्तकालय
लाइब्रेरी लेखक #
ग्राहकों के लिए ब्रेकिंग परिवर्तन का कारण के बिना -पाइपेंट आइडेंटिफ़ायर को रिफलेक्टर कर सकते हैं। दूसरी तरफ लाइब्रेरी उपयोगकर्ता आंतरिक क्षेत्रों तक पहुँचने से सुरक्षित हैं।
जेएस एपीआई #
-प्राकृतिक क्षेत्रों को छोड़ देता है
बिल्ट-इन जेएस कार्यों और तरीकों की अनदेखी-अलग-अलग #
क्षेत्रों। इसके परिणामस्वरूप रन-टाइम में अधिक अनुमानित संपत्ति का चयन किया जा सकता है। उदाहरण: Object.keys
, Object.entries
, JSON.stringify
, for..in
पाश और अन्य ( कोड नमूना है, यह भी मैट Bierner देखते जवाब ):
class Foo {
#bar = 42;
baz = "huhu";
}
Object.keys(new Foo()); // [ "baz" ]
मामलों का उपयोग करें: private
कीवर्ड
प्रस्तावना:
आंतरिक वर्ग एपीआई और राज्य तक पहुंच (संकलन-समय केवल गोपनीयता)
private
एक वर्ग के सदस्य रन-टाइम में पारंपरिक गुण हैं। हम इस लचीलेपन का उपयोग वर्ग आंतरिक एपीआई या राज्य को बाहर से एक्सेस करने के लिए कर सकते हैं। कंपाइलर चेक को संतुष्ट करने के लिए, प्रकार के दावे, डायनेमिक प्रॉपर्टी एक्सेस जैसे तंत्र या @ts-ignore
दूसरों के बीच उपयोग किया जा सकता है।
प्रकार अभिकथन ( as
/ <>
) और any
टाइप किए गए चर असाइनमेंट के साथ उदाहरण :
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
टीएस यहां तक कि private
एक एस्केप-हैच के साथ एक सदस्य की गतिशील संपत्ति का उपयोग करने की अनुमति देता है :
class C {
private foo = 10;
}
const res = new C()["foo"]; // 10, res has type number
निजी पहुंच कहां समझ में आ सकती है? (1) यूनिट परीक्षण, (2) डिबगिंग / लॉगिंग की स्थिति या (3) प्रोजेक्ट-इंटरनल क्लासेस (ओपन-एंडेड लिस्ट) के साथ अन्य उन्नत केस परिदृश्य।
आंतरिक चर तक पहुंच थोड़ा विरोधाभासी है - अन्यथा आपने उन्हें private
पहले स्थान पर नहीं बनाया होगा । एक उदाहरण देने के लिए, यूनिट परीक्षणों को ब्लैक / ग्रे बक्से के रूप में माना जाता है, जिसमें निजी क्षेत्र कार्यान्वयन विस्तार के रूप में छिपे होते हैं। हालांकि व्यवहार में, मामले से मान्य मान्य दृष्टिकोण हो सकते हैं।
सभी ईएस वातावरण में उपलब्ध है
टीएस private
संशोधक का उपयोग सभी ईएस लक्ष्यों के साथ किया जा सकता है। #
-प्राकृतिक क्षेत्र केवल target
ES2015
/ ES6
या उच्चतर के लिए उपलब्ध हैं । ES6 + में, WeakMap
आंतरिक रूप से डाउनलेवल कार्यान्वयन ( यहां देखें ) के रूप में उपयोग किया जाता है । #
वर्तमान में मूल निवासी क्षेत्रों की आवश्यकता है target
esnext
।
संगति और अनुकूलता
टीमें private
केवल पहुंच संशोधक के रूप में उपयोग को लागू करने के लिए कोडिंग दिशानिर्देशों और लिंटर नियमों का उपयोग कर सकती हैं। यह प्रतिबंध #
सुसंगतता के साथ मदद कर सकता है और बैकवर्ड-संगत तरीके से -पाइप फील्ड नोटेशन के साथ भ्रम से बच सकता है।
यदि आवश्यक हो, पैरामीटर गुण (कंस्ट्रक्टर असाइनमेंट आशुलिपि) एक शो स्टॉपर हैं। उन्हें केवल private
कीवर्ड के साथ उपयोग किया जा सकता है और -प्राकृतिक क्षेत्रों को लागू करने के लिए अभी तक कोई योजना नहीं है #
।
अन्य कारण
private
कुछ डाउन-लेवलिंग मामलों में बेहतर रन-टाइम प्रदर्शन प्रदान करें ( यहां देखें )।
- टीएस में अब तक कोई कठिन निजी कक्षा विधियाँ उपलब्ध नहीं हैं।
- कुछ लोगों को
private
कीवर्ड नोटेशन बेहतर not पसंद है।
दोनों पर ध्यान दें
दोनों दृष्टिकोण संकलन-समय पर कुछ प्रकार के नाममात्र या ब्रांडेड प्रकार बनाते हैं।
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
इसके अलावा, दोनों क्रॉस-इंस्टेंस एक्सेस की अनुमति देते हैं: क्लास का एक उदाहरण A
अन्य A
उदाहरणों के निजी सदस्यों तक पहुंच सकता है :
class A {
private a = 0;
method(arg: A) {
console.log(arg.a); // works
}
}
सूत्रों का कहना है