任何方式来在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
对象是any
types的。 当嵌套的类工作项被修复时,这可以被改进。
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();
这有点晚,但其他人可能会觉得有用。 这就是我骗过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 {} } }