TypeScript 合并和导出命名空间错误

TypeScript merged and exported namespace error

我正在开发使用 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 {

    ...
}

但现在我有错误:

  1. (TS) 合并声明中的单独声明 'ol' 必须全部导出或全部本地。
  2. ol.interaction.Pointer - (TS) 属性 'Pointer' 类型 'typeof interaction' 上不存在。
  3. (TS) 导入声明与 'ol'
  4. 的本地声明冲突

我真的不知道我该怎么办。 我刚开始使用 TS,这些错误并没有告诉我太多。

有什么建议吗?

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

有一些问题。

  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.

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