क्या आप टाइपस्क्रिप्ट में नेस्टेड क्लासेस बना सकते हैं?


93

टाइपस्क्रिप्ट में वर्गों को घोंसला बनाने का एक तरीका है। जैसे मैं उनका उपयोग करना चाहूंगा:

var foo = new Foo();
var bar = new Foo.Bar();

जवाबों:


132

टाइपस्क्रिप्ट 1.6 के साथ शुरू होने पर हमारे पास वर्ग अभिव्यक्ति ( संदर्भ ) है।

इसका मतलब है आप निम्न कार्य कर सकते हैं:

class Foo {
    static Bar = class {

    }
}

// works!
var foo = new Foo();
var bar = new Foo.Bar();

1
यह उदाहरण टाइपस्क्रिप्ट 1.6.3 में काम नहीं करता है: त्रुटि TS4028 सार्वजनिक स्थैतिक संपत्ति 'बार' के निर्यात की गई श्रेणी का है या निजी नाम '(बेनामी वर्ग)' का उपयोग कर रहा है।
— सर्गेई

1
@ Sergey मुझे वही समस्या थी इसलिए नीचे दिए गए मेरे उत्तर के अनुसार नामस्थान का उपयोग करना शुरू कर दिया।
— डैन डेफ

क्या एक वर्ग के अंदर इंटरफ़ेस बनाने का एक तरीका है? यानी अगर हम चाहते हैं कि बार
— RoG

@ लिटाहर्वी - एक उपयोग मामला एक बाहरी इंटरफ़ेस का एक निजी कार्यान्वयन होगा, उदाहरण के लिए, एक कारखाना विधि। जावा (और अन्य) से एक अन्य उदाहरण पुनरावृत्तियां हैं जिनके पास अपने वर्ग के सदस्य चर के विशेषाधिकार प्राप्त उपयोग की आवश्यकता होती है और स्कोपिंग नियमों के माध्यम से स्वचालित रूप से ऐसा होता है, लेकिन आप कभी नहीं चाहते हैं कि ये सीधे निर्यात और त्वरित हो।
— डेव

35

यहां क्लास एक्सप्रेशंस का उपयोग करके अधिक जटिल उपयोग मामला है ।

यह आंतरिक वर्ग को बाहरी वर्ग के privateसदस्यों तक पहुंचने की अनुमति देता है ।

class classX { 
    private y: number = 0; 

    public getY(): number { return this.y; }

    public utilities = new class {
        constructor(public superThis: classX) {
        }
        public testSetOuterPrivate(target: number) {
            this.superThis.y = target;
        }
    }(this);    
}

const x1: classX = new classX();
alert(x1.getY());

x1.utilities.testSetOuterPrivate(4);
alert(x1.getY());

codepen


3
@RyanCavanaugh "आंतरिक" वर्ग अभिव्यक्ति बग के अंदर निजी सदस्यों तक पहुंचने की क्षमता है?
— बनिएलैंड

5
मैंने सत्यापित किया कि यह टाइपस्क्रिप्ट टीम के साथ सही उपयोग है। github.com/Microsoft/TypeScript/issues/…
— bnieland

1
क्या इसे सीधे पास किए बिना अभिभावक संदर्भ तक पहुंच संभव है?
— shabunc

@shabunc को मेरी जानकारी नहीं है
— bnieland

19

मैं संकलित त्रुटि प्राप्त किए बिना निर्यात की गई कक्षाओं के साथ काम करने के लिए इसे प्राप्त नहीं कर सका, इसके बजाय मैंने नामस्थान का उपयोग किया :

namespace MyNamespace {
    export class Foo { }
}

namespace MyNamespace.Foo {
    export class Bar { }
}

वही। 'फू' केवल एक प्रकार को संदर्भित करता है, लेकिन यहां नामस्थान के रूप में उपयोग किया जा रहा है।
— विल बेंसन

12

यदि आप एक प्रकार की घोषणा फ़ाइल के संदर्भ में हैं, तो आप कक्षाओं और नामस्थानों को मिलाकर कर सकते हैं:

// foo.d.ts
declare class Foo {
  constructor();
  fooMethod(): any;
}

declare namespace Foo {
  class Bar {
    constructor();
    barMethod(): any;
  }
}

// ...elsewhere
const foo = new Foo();
const bar = new Foo.Bar();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.