带有子模块的Typescript定义文件

时间:2015-05-19 12:59:30

标签: javascript typescript

我在我提供dds对象的TypeScript源代码中使用Vortex Web JavaScript库。这是一个片段:

var runtime = new dds.runtime.Runtime();
runtime.connect("ws://localhost:9000", "user:pass");

var chatTopic = new dds.Topic(0, 'ChatMessage');
runtime.registerTopic(chatTopic);

对于这个库,我想写一个定义文件。

这是我目前的尝试:

declare module VortexWebClient {

    interface TopicQos {
        new (): TopicQos;
    }

    interface Topic {
        new (domainID: number, topicName: string): Topic;
        new (domainID: number, topicName: string, tqos: TopicQos): Topic;
        new (domainID: number, topicName: string, tqos: TopicQos, topicType: string): Topic;
        new (domainID: number, topicName: string, tqos: TopicQos, topicType: string, typeName: string): Topic;
    }   

    interface Runtime {
        new (): Runtime;
        connect(server: string, authToken: string);
        disconnect();
        registerTopic(topic: Topic);
    }

    interface runtime {
        Runtime: Runtime;
    }


    export interface DDS {
        runtime : runtime;
        Topic : Topic;
        VERSION: string;
    }


}

declare var dds: VortexWebClient.DDS;

这样可行,但在我看来应该有更好的方法来使用export关键字。特别要列出底部DDS界面的所有成员(还有很多要编写的内容)应该避免。

我尝试了许多不同的方法,其中一种是以下方式。它应该避免显式创建dds接口,它只是一个包装器,所以说:

declare module DDS {

    export interface TopicQos {
        new (): TopicQos;
    }

    export interface Topic {
        new (domainID: number, topicName: string): Topic;
        new (domainID: number, topicName: string, tqos: TopicQos): Topic;
        new (domainID: number, topicName: string, tqos: TopicQos, topicType: string): Topic;
        new (domainID: number, topicName: string, tqos: TopicQos, topicType: string, typeName: string): Topic;
    }

    interface Runtime {
        new (): Runtime;
        connect(server: string, authToken: string);
        disconnect();
        registerTopic(topic: Topic);
    }

    export interface runtime {
        Runtime: Runtime;
    }

    export var VERSION: string;

}

//Here IntelliJ complaints: "Cannot find name: DDS"
declare var dds: DDS;

创建包含多个子模块的定义文件的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

此行中的错误:

declare var dds: DDS;

因为DDS不是类型,所以它是一个模块。但是你正试图将它作为一种类型使用。

您可以改为将DDS重命名为dds,然后它实际上是一个变量,用于保存具有您已声明的内部结构的对象。

答案 1 :(得分:1)

从示例的开头开始,./manage.py makemigrations autotester ./manage.py migrate autotester 是一个全局对象。

dds

它有declare var dds: any; 属性。

runtime

declare var dds: { runtime : any}; 有一个名为runtime的属性,它是一个带有不带参数的构造函数的类。

Runtime

declare var dds: { runtime : { Runtime: typeof Runtime } }; declare class Runtime { constructor(); } 类有一个名为Runtime的方法,它接受两个字符串并返回void。

connect

这填补了您的初始要求。现在,通过将所有类型(全局declare var dds: { runtime : { Runtime: typeof Runtime } }; declare class Runtime { constructor(); connect(server: string, authToken: string): void; } 除外)放在dds模块中,让我们整理一下。

VortexWeb

这是你的首发定义。希望有所帮助!