2

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

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

我的 openlayers.ts 看起来像:

declare namespace ol {

    namespace interaction {
        interface someEvent {
            ...
        }

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

我知道ol namespace从基础 OpenLayers 库和我的扩展ol namespace将被合并。TypeScript 文档清楚地描述了如何合并命名空间。

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

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

export declare namespace ol {

    ...
}

正如您在我的文章中看到的那样,ol namespace我有一个myExtendedClass需要扩展的内容ol.iteraction.Pointer(来自基本 OpenLayers)。

但是现在,当我导出我的命名空间时,app 不知道它是什么ol.interaction.Pointer。所以我推断我必须将基本 OpenLayers 导入到我的文件中,我的应用程序现在将检测什么是ol.interaction.Pointer.

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

import ol = require('openlayers');

export declare namespace ol {

    ...
}

但现在我有错误:

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

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

有什么建议吗?

4

1 回答 1

1

好的,我找到了解决方案。

有一些问题。

  1. 首先是我不明白我的命名空间扩展将如何工作。我真的不知道是否应该从我的 openlayers.ts 文件或全局 OpenLayers 参考中取消这些扩展。但我又读了几次 TS 文档,我一直在寻找一些互联网解决方案,在阅读后我明白如果我想扩展一些命名空间 - 我必须像在原始库中一样取消这些扩展。它的工作方式类似于用 C# 编写的普通字符串或集合扩展。我没有取消 MyStringExtenstion.SomeMethod(myString)。我必须 void myString.SomeMethod();
  2. 我没有将 OpenLayers 导入到我的 openlayers.ts 文件中——这是命名空间合并的力量——如果命名空间具有相同的名称——它将被合并——仅此而已。所以我删除了import ol = require('openlayers');
  3. 这个场景的最后一个问题是导出我的扩展命名空间。现在我正在考虑它,我明白它是多么愚蠢,因为如果我将我的命名空间与全局 OpenLayers 命名空间合并,我就不需要再次导出它了。我的命名空间进入了全局 OpenLayers 命名空间——仅此而已。所以我export declare namespace ol改为declare namespace ol.

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

于 2018-07-05T14:00:13.177 回答