任何方式来在typescript中声明一个嵌套类结构?

我有兴趣定义一个现有的框架(openlayers.d.ts),但不知道如何expressionOpenLayers.Layer是OpenLayers.Layer.Markers的类和名称空间的事实。 我相信这使得Markers成为一个嵌套的Layer类。

用法:

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

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

这似乎已经在0.9.1.1和更高版本中得到修复。 你只需要创build一个与你想要嵌套types的类同名的模块,并把你的嵌套types放入其中。

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

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

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

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

正如下面的注释中的用户@recursion所提到的那样,声明的顺序很重要。 因此,类定义必须位于具有嵌套types的模块之前。

您可以使用模块合并来获得嵌套类的等效效果。 这个例子改编自Pro TypeScript的第1章。

您可以使用一个类和一个模块,或者一个function和一个模块来执行模块合并。

在所有情况下,模块必须出现在合并工作的类或函数之后。

适应的例子:

 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年发布)适用于TypeScript的0.8版本。

你仍然可以创build一个允许你描述的用法的声明,只是Markers对象是anytypes的。 当嵌套的类工作项被修复时,这可以被改进。

 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('...'); 

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

 class A { static B = class { } } var a = new A(); var b = new AB(); 

目前不支持嵌套类。

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

这有点晚,但其他人可能会觉得有用。 这就是我骗过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(); 

为此使用TypeScript的类expression式

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