Any way to declare a nest class structure in typescript?

前端 未结 6 1944
盖世英雄少女心
盖世英雄少女心 2020-12-05 06:35

I\'m interested in defining an existing framework (openlayers.d.ts) but cannot figure out how to express the fact that OpenLayers.Layer is both a class and a namespace for O

相关标签:
6条回答
  • 2020-12-05 06:41

    As of 2016, I guess this is easier:

    class A {
        static B = class { }
    }
    
    var a = new A();
    var b = new A.B();
    
    0 讨论(0)
  • 2020-12-05 06:48

    Use TypeScript's class expressions for this:

    var OpenLayers = class {
        static Layer = class {
            static Markers = class {}
        }
    }
    
    0 讨论(0)
  • 2020-12-05 06:54

    You can use namespace/class merging to get an equivalent effect to nested classes. This example is adapted from Chapter 1 of Pro TypeScript.

    You perform merging with a class and a namespace, or with a function and a namespace.

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

    Adapted example:

    class Outer {
    
    }
    
    namespace 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();
    
    0 讨论(0)
  • 2020-12-05 06:58

    Currently there is no support for nested classes.

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

    0 讨论(0)
  • 2020-12-05 06:58

    This is a bit late but others may find it useful. This is how I did it to fool TS to accomplish the task.

    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 讨论(0)
  • 2020-12-05 06:59

    This seems like it has been fixed in versions 0.9.1.1 and later. You just have to create a module with the same name as the class where you want to nest types, and put your nested types in it.

    More concretely, this is how you do it:

    declare module a
    {
        class b
        {
        }
    
        module b
        {
            class c
            {
            }
        }
    }
    
    var myB = new a.b();
    var myC = new a.b.c();
    

    This works as well when nesting types in typescript code with the export keyword:

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

    As mentioned by the user @recursive in the comments below, the order of declaration is important. So the class definition must be located before the module with the nested types.

    0 讨论(0)
提交回复
热议问题