【问题标题】:TypeScript module and class simultaneously?TypeScript 模块和类同时进行?
【发布时间】:2012-10-14 11:17:39
【问题描述】:

我目前正在尝试为 OpenLayers 构建一个 TypeScript 定义文件。

问题在于 OpenLayers 中的某些类会同时转换为 TypeScript 中的模块和类。

例如,OpenLayers 模块中有Protocol 类,OpenLayers.Protocol 模块中有Response 类。

如何在 TypeScript 中建模?我可以将Protocol 设为一个类并将Response 类定义为导出的内部类吗?你将如何解决这个问题?

【问题讨论】:

标签: class module typescript


【解决方案1】:

Response 声明为具有构造函数类型的Protocolstatic 字段,返回定义Response 类的interface

declare module OpenLayers {
    export interface IProtocolResponse {
        foo(): void;
    }

    export class Protocol {
        static Response: new () => IProtocolResponse;
    }
}

var response = new OpenLayers.Protocol.Response();
response.foo();

编辑:

或者正如 Anders 在 this discussion list question 中指出的那样,您可以通过这种方式为内部类创建多个构造函数:

declare module OpenLayers {
    export interface IProtocolResponse {
        foo(): void;
    }

    export class Protocol {
        static Response: {
            new (): IProtocolResponse;
            new (string): IProtocolResponse;
        };
    }
}

var response = new OpenLayers.Protocol.Response('bar');
response.foo();

这两种方法的主要缺点是不能从OpenLayers.Protocol.Response 派生类。

【讨论】:

    【解决方案2】:

    这是我的更新答案,希望对您有所帮助 - 它应该可以帮助您开始定义 OpenType:

    declare module OpenType {
       export class Protocol {
           constructor();
           Request;
       }
    }
    
    var x = new OpenType.Protocol();
    var y = new  x.Request();
    var z = x.Request;
    

    【讨论】:

    • 遗憾的是,这两种解决方案都不可行。第一个,因为它不是我真正想要的,因为 Protocol.Response 应该包含该类而不是它的实例。遗憾的是,第二个也是不可能的,因为我不能只重命名 OpenLayers 中的类 :(.
    • 我已经添加了第三次尝试,看看是否是你所追求的。
    • 好吧,我正在构建 TypeScript(来自 Microsoft 的类型化 JavaScript)定义文件。它们并不是真正的实现,而是一种接口声明。因此遗憾的是,第三种解决方案也不起作用。
    • 啊 - 好吧 - 所以你只想能够定义一个现有的 JavaScript 文件。
    • 事实上 - 你在你的问题中说过,所以我很抱歉错过了!
    猜你喜欢
    • 2019-03-05
    • 1970-01-01
    • 2012-10-14
    • 2020-09-11
    • 2015-01-30
    • 2018-06-05
    • 2019-04-21
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多