2012-11-21 27 views
43

मुझे मौजूदा फ्रेमवर्क (openlayers.d.ts) को परिभाषित करने में दिलचस्पी है, लेकिन यह पता नहीं लगा सकता कि ओपनलेयर.लेयर ओपनलेयर के लिए एक क्लास और नेमस्पेस दोनों हैं। लेयर। मार्कर। मेरा मानना ​​है कि यह मार्करों को लेयर का घोंसला वाला वर्ग बनाता है।टाइपस्क्रिप्ट में घोंसला वर्ग संरचना घोषित करने का कोई तरीका?

उपयोग:

l = new OpenLayers.Layer(...); // this is a base class, never do this 
m = new OpenLayers.Layer.Markers(...); 

आप टाइपप्रति में दोनों परत और मार्करों वर्ग कैसे घोषित होगा?

+0

यह अनुत्तरित प्रश्न का डुप्लिकेट हो गया लगता है पर http://स्टैक ओवरफ़्लो।कॉम/प्रश्न/1279 9 433/टाइपस्क्रिप्ट-मॉड्यूल-एंड-क्लास-साथ-साथ –

+2

इस बारे में बात नहीं कर रहे कि आप इसे * घोषणा * परिप्रेक्ष्य से कैसे मॉडल करना चाहते हैं लेकिन टाइपस्क्रिप्ट में अब नेस्टेड क्लास समर्थन है: http://stackoverflow.com/a/32494175/390330 – basarat

उत्तर

50

ऐसा लगता है कि यह संस्करण 0.9.1.1 और बाद में संस्करणों में तय किया गया है। आपको बस उसी नाम के साथ एक मॉड्यूल बनाना होगा जहां आप घोंसले के प्रकार चाहते हैं, और इसमें अपने घोंसले वाले प्रकार डालें।

अधिक वस्तुतः, यह तुम कैसे करते:

declare module a 
{ 
    class b 
    { 
    } 

    module b 
    { 
     class c 
     { 
     } 
    } 
} 

var myB = new a.b(); 
var myC = new a.b.c(); 

यह रूप में अच्छी तरह से काम करता है जब निर्यात कीवर्ड के साथ टाइपप्रति कोड में प्रकार नेस्टिंग:

export module a 
{ 
    export class b 
    { 
    } 

    export module b 
    { 
     export enum c 
     { 
      C1 = 1, 
      C2 = 2, 
      C3 = 3, 
     } 
    } 
} 

उपयोगकर्ता @recursive ने उल्लेख किया नीचे दी गई टिप्पणियों में, घोषणा का आदेश महत्वपूर्ण है। तो कक्षा परिभाषा मॉड्यूल से पहले नेस्टेड प्रकारों के साथ स्थित होना चाहिए।

+7

मैं इसे काम पर नहीं मिला, लेकिन फिर मुझे एहसास हुआ कि आदेश महत्वपूर्ण है। यह केवल तभी काम करता है जब आप कक्षा को पहले घोषित करते हैं, और फिर मॉड्यूल। यह दूसरी तरफ काम नहीं करता है। – recursive

+0

आप टाइपस्क्रिप्ट का उपयोग कर एक कोणीय परियोजना के साथ ऐसा कैसे करते हैं? मॉड्यूल सजावट का उपयोग करते हैं: @NgModule –

7

वर्तमान में नेस्टेड कक्षाओं के लिए कोई समर्थन नहीं है।

http://typescript.codeplex.com/workitem/460

+0

यह संस्करण 0.9.1.1 और बाद में तय किया गया है। नीचे मेरा जवाब देखें। – sboisse

12

आप नेस्टेड वर्गों के लिए एक समान प्रभाव प्राप्त करने के विलय मॉड्यूल का उपयोग कर सकते हैं। यह उदाहरण प्रो टाइपस्क्रिप्ट के अध्याय 1 से अनुकूलित किया गया है।

आप कक्षा और मॉड्यूल के साथ विलय मॉड्यूल करते हैं, या फ़ंक्शन और मॉड्यूल के साथ।

In all cases, the module must appear after the class or function for the merge to work.

अनुकूलित उदाहरण:

class Outer { 

} 

module Outer { 
    export class Mid { 

    } 

    export module Mid { 
     export class Inner { 

     } 
    } 
} 

var a = new Outer(); 
var b = new Outer.Mid(); 
var x = new Outer.Mid.Inner(); 

मूल उत्तर

नोट: इस मूल जवाब (2012 में तैनात) टाइपप्रति के संस्करण 0.8 के लिए आवेदन किया।

आप अभी भी एक घोषणा कर सकते हैं जो आपके द्वारा वर्णित उपयोग की अनुमति देगा, यह केवल Markers ऑब्जेक्ट any प्रकार का होगा। नेस्टेड क्लास वर्क आइटम तय होने पर यह बेहतर किया जा सकता है।

declare module OpenLayers { 
    export class Layer { 
     constructor(param: string); 
     static Markers(param: string); 
    } 
} 


var l = new OpenLayers.Layer('...'); // this is a base class, never do this 
var m = new OpenLayers.Layer.Markers('...'); 
+0

मिड क्लास से बाहरी कक्षा तक विधि कैसे कॉल करें? – cracker

6

यह थोड़ा देर हो चुकी है लेकिन अन्य इसे उपयोगी पा सकते हैं। इस तरह मैंने कार्य पूरा करने के लिए टीएस को मूर्ख बनाने के लिए किया।

declare module OpenLayers { 
    interface Layer { 
    .... 
    } 

    interface Markers { 
    .... 
    } 

    var Layer: { 
    new(name:string, options?:any):Layer; 
    prototype:Layer; 
    Markers: { 
     new(params?:any):Markers; 
     prototype: Markers; 
    } 
    } 
} 

var markers = new OpenLayers.Layer.Markers(); 
+0

इसने मेरी समस्या हल की – nkint

+0

लेयर नामक एक इंटरफेस के रूप में आपके पास समान स्कोप में लेयर नामक चर हो सकता है? – CodyBugstein

8

2016 के रूप में, मुझे लगता है कि यह है आसान:

class A { 
    static B = class { } 
} 

var a = new A(); 
var b = new A.B(); 
+2

मुझे यह संकलन त्रुटि मिलती है 'परमाणु संदर्भों में आरंभकर्ताओं को अनुमति नहीं है' परमाणु नवीनतम टीएस प्लगइन – nkint

+0

आप बिना बी के 'बी' की विधि के भीतर 'ए' के ​​'' 'को कैसे देख सकते हैं यह स्पष्ट रूप से एक तर्क के रूप में? या यह असंभव है क्योंकि 'बी' स्थिर है? मेरा वर्तमान समाधान सिर्फ 'ए' पर 'बीएफटीसी' विधि है जहां मैं 'ए 'सदस्यों तक पहुंच सकता हूं और उन्हें' बी 'कन्स्ट्रक्टर को स्पष्ट रूप से पास कर सकता हूं, लेकिन मुझे उम्मीद थी कि ऐसा करने का एक मामूली तरीका था। – Monkpit

+0

@ मोंकपिट: 'यह' एक 'ए' ऑब्जेक्ट को संदर्भित करता है, न कि 'ए' कक्षा में। आप कई 'ए' और कई 'बी' को तुरंत चालू कर सकते हैं, प्रत्येक के अपने 'इस' के साथ। तो एक विशेष 'बी' कैसे पता चलेगा कि आप किस 'ए' को एक्सेस करना चाहते हैं? – MarcG

3

उपयोग टाइपप्रति के वर्ग भाव इस के लिए:

var OpenLayers = class { 
    static Layer = class { 
     static Markers = class {} 
    } 
} 
+0

क्या यह भी काम करता है यदि शीर्ष स्तर की वस्तु 'निर्यात' है? मुझे निम्नलिखित त्रुटि का सामना करना पड़ रहा है: निर्यातित वर्ग की सार्वजनिक स्थैतिक संपत्ति 'माइप्रॉप' का निजी नाम '(बेनामी क्लास)' है या नहीं। कोई उपाय? –

+0

@ सैयानपाल नहीं जानते कि आप क्या करने की कोशिश कर रहे हैं – Vad

संबंधित मुद्दे