54

我对定义现有框架 (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(...);

您将如何在 typescript 中同时声明 Layer 和 Markers 类?

4

6 回答 6

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

这在使用 export 关键字在打字稿代码中嵌套类型时也有效:

export module a
{
    export class b
    {
    }

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

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

于 2014-02-20T21:44:26.967 回答
15

您可以使用命名空间/类合并来获得与嵌套类等效的效果。这个例子改编自 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();
于 2012-11-21T17:24:33.110 回答
8

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

class A {
    static B = class { }
}

var a = new A();
var b = new A.B();
于 2016-02-17T02:17:04.273 回答
6

目前不支持嵌套类。

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

于 2012-11-21T16:38:12.217 回答
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();
于 2013-07-03T23:12:06.093 回答
3

为此使用 TypeScript 的类表达式

var OpenLayers = class {
    static Layer = class {
        static Markers = class {}
    }
}
于 2016-04-14T09:18:10.187 回答