我对定义现有框架(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(...);
你如何在打字稿中声明Layer和Markers类?
答案 0 :(得分: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关键字在typescript代码中嵌套类型时也可以这样做:
export module a
{
export class b
{
}
export module b
{
export enum c
{
C1 = 1,
C2 = 2,
C3 = 3,
}
}
}
如下面评论中的用户@recursive所述,声明的顺序很重要。因此,类定义必须位于具有嵌套类型的模块之前。
答案 1 :(得分: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();
答案 2 :(得分:8)
截至2016年,我想这更容易:
class A {
static B = class { }
}
var a = new A();
var b = new A.B();
答案 3 :(得分:6)
答案 4 :(得分: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();
答案 5 :(得分:3)
使用TypeScript的类表达式:
server