2015-09-10 10 views
20

टाइपस्क्रिप्ट में घोंसला कक्षाओं का कोई तरीका है। जैसे हम वर्ग भाव (reference) हैक्या आप टाइपस्क्रिप्ट में नेस्टेड कक्षाएं बना सकते हैं?

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

बड़े टाइपप्रति (<1.6) के लिए, देखें [टाइपस्क्रिप्ट में कक्षाओं को घोंसला करने का कोई तरीका?] (Http://stackoverflow.com/questions/13495107/any-way-to-nest-classes-in-typescript) –

उत्तर

36

टाइपप्रति 1.6 के साथ शुरू: मैं उनकी तरह उपयोग करना चाहते हैं।

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

class Foo { 
    static Bar = class { 

    } 
} 

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

यह उदाहरण टाइपस्क्रिप्ट 1.6.3 में काम नहीं करता है: त्रुटि टीएस 4028 एक्सपो के सार्वजनिक स्थैतिक संपत्ति 'बार' rted कक्षा निजी नाम '(बेनामी वर्ग) का उपयोग कर रही है या है। – Sergey

+0

@ सर्गी मुझे एक ही समस्या थी इसलिए नीचे दिए गए उत्तर के अनुसार नामस्थान का उपयोग करना शुरू कर दिया। –

+0

क्या होगा यदि आप फू के बाहर बार कक्षा का उपयोग करने का प्रयास करते हैं? मेरा मतलब है, क्या कक्षा के अंदर कक्षा निर्धारित करने का कोई कारण है जहां इस वर्ग से कोई भी इसका उपयोग नहीं कर सकता है? मेरी राय में इसका उपयोगिता नहीं है। मेरा वोट @ Aydus-Matthew पर जाता है। –

-1

यह दृष्टिकोण एक टाइपप्रति Angular2/Ionic2 वातावरण में काम किया।

foo.ts

import { Bar} from './bar'; 

export class Foo { 
    id: number; 
    bar: Bar; 
} 

bar.ts

export class Bar { 
    id: number; 
} 

उदाहरण वर्ग उपयोग:

foo = new Foo(); 
foo.bar = new Bar(); 
foo.bar.id = 1; 
+3

प्रश्न जावा और सी # जैसी कई लोकप्रिय भाषाओं में अनुमति के रूप में घोंसला वाले वर्गों (अन्य वर्गों में परिभाषित कक्षाओं) के बारे में है। यह उत्तर गुणों/सदस्यों को कक्षा में जोड़ने के लिए है, जो एक बहुत ही अलग बात है। –

5

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

namespace MyNamespace { 
    export class Foo { } 
} 

namespace MyNamespace.Foo { 
    export class Bar { } 
} 
3

कक्षा अभिव्यक्ति का उपयोग करके यहां एक अधिक जटिल उपयोग केस है। यह आंतरिक वर्ग को बाहरी वर्ग के निजी सदस्यों तक पहुंचने की अनुमति देता है।

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

+0

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

+0

मैंने सत्यापित किया कि यह टाइपस्क्रिप्ट टीम के साथ सही उपयोग है। https://github.com/Microsoft/TypeScript/issues/17535#issuecomment-319187970 – bnieland

1

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

// 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(); 
संबंधित मुद्दे