有什么方法可以在typescript中声明一个嵌套类结构吗?

Cor*_*lix 50 typescript

我对定义现有框架(openlayers.d.ts)很感兴趣,但无法弄清楚如何表达OpenLayers.Layer既是OpenLayers.Layer.Markers的类和命名空间这一事实.我相信这使得Markers成为Layer的嵌套类.

用法:

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

你会如何在打字稿中声明Layer和Markers类?

sbo*_*sse 55

这似乎已在版本0.9.1.1及更高版本中得到修复.您只需创建一个与要嵌套类型的类同名的模块,并将嵌套类型放入其中.

更具体地说,这是你如何做到的:

declare module a
{
    class b
    {
    }

    module b
    {
        class c
        {
        }
    }
}

var myB = new a.b();
var myC = new a.b.c();
Run Code Online (Sandbox Code Playgroud)

当使用export关键字在typescript代码中嵌套类型时,这也可以正常工作:

export module a
{
    export class b
    {
    }

    export module b
    {
        export enum c
        {
            C1 = 1,
            C2 = 2,
            C3 = 3,
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如用户@recursive在下面的评论中所提到的,声明的顺序很重要.因此,类定义必须位于具有嵌套类型的模块之前.

  • 我无法让这个工作,但后来我意识到订单很重要.如果您先声明该类,然后再声明该模块,这似乎才有效.它反过来不起作用. (7认同)

Fen*_*ton 13

您可以使用命名空间/类合并来获得与嵌套类相同的效果.此示例改编自Pro TypeScript的第1章.

您可以与类和命名空间或函数和命名空间进行合并.

在所有情况下,命名空间必须出现在合并工作的类或函数之后.

改编示例:

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();
Run Code Online (Sandbox Code Playgroud)


Mar*_*rcG 8

截至2016年,我想这更容易:

class A {
    static B = class { }
}

var a = new A();
var b = new A.B();
Run Code Online (Sandbox Code Playgroud)

  • 我得到这个编译错误`初始化器不允许在环境上下文中使用atom latest ts插件 (2认同)

小智 6

这有点晚了,但其他人可能觉得它很有用.这就是我欺骗TS来完成任务的方法.

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();
Run Code Online (Sandbox Code Playgroud)