TypeScript合并和导出的名称空间错误

时间:2018-07-05 11:54:17

标签: angular typescript openlayers extends dependency-tree

我正在使用TS和OpenLayers的应用程序工作。 我正在尝试构建依赖关系树,以便在所有应用程序中都将导入和导出语句放入我的* .ts文件中。

我有文件“ openlayers.ts”,它扩展了基本的OpenLayers库。 例如,它扩展了openlayers交互名称空间。

我的openlayers.ts看起来像:

declare namespace ol {

    namespace interaction {
        interface someEvent {
            ...
        }

        class myExtendedClass extends ol.interaction.Pointer {
            ...
        }
    }
}

我知道基本OpenLayers库中的ol namespace和我的扩展ol namespace将被合并。 TypeScript documentation清楚地描述了如何合并名称空间。

但是我的问题始于我不得不导出扩展名称空间的时候,因为它是在我的应用程序中使用的,并且在导出它之前-应用程序没有看到我的扩展名称空间。

我的openlayers.ts现在看起来像:

export declare namespace ol {

    ...
}

您可以看到我的ol namespace中有一个myExtendedClass,它需要扩展ol.iteraction.Pointer(来自基本OpenLayers)。

但是现在,当我导出我的名称空间时,应用程序不知道它是ol.interaction.Pointer。因此,我推断我必须将基本的OpenLayers导入到我的文件中,并且我的应用程序现在将检测到ol.interaction.Pointer

我的openlayers.ts现在看起来像:

import ol = require('openlayers');

export declare namespace ol {

    ...
}

但是现在我出现了错误:

    合并声明'ol'中的
  1. (TS)单个声明必须全部导出或全部本地化。
  2. ol.interaction.Pointer-(TS)属性“指针”上,类型“ typeof交互”不存在。
  3. (TS)导入声明与本地声明“ ol”冲突

我真的不知道该怎么办。 我刚开始使用TS,这些错误并不能说明我太多。

有没有建议?

1 个答案:

答案 0 :(得分:1)

好,我找到了解决方法。

有一些问题。

  1. 首先是我不了解我的命名空间扩展将如何工作的事实。我真的不知道是否应该从我的openlayers.ts文件或全局OpenLayers参考中删除那些扩展。但是我又读了几次TS文档,我一直在寻找Internet的解决方案,阅读后我了解到,如果我想扩展某些名称空间-我必须像在原始库中那样将那些扩展作废。它像正常的字符串或用C#编写的集合扩展一样工作。我没有使MyStringExtenstion.SomeMethod(myString)无效。我必须使myString.SomeMethod();
  2. 我还没有将OpenLayers导入到我的openlayers.ts文件中-这是名称空间合并的强大功能-如果名称空间具有相同的名称-它将被合并-仅此而已。所以我删除了import ol = require('openlayers');
  3. 此方案的最后一个问题是导出我的扩展名称空间。现在,我正在考虑它,我看到它有多愚蠢,因为如果将我的命名空间与全局OpenLayers命名空间合并,则无需再导出一次。我的命名空间已放入全局OpenLayers命名空间中,仅此而已。因此我将export declare namespace ol更改为declare namespace ol

我将把问题留给有类似问题的人。我会让找到解决方案的速度比我发现的快得多。