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 {
...
}
但现在我有错误:
- (TS) 合并声明中的单独声明 'ol' 必须全部导出或全部本地。
- 在
ol.interaction.Pointer
- (TS) 属性 'Pointer' 类型 'typeof interaction' 上不存在。
- (TS) 导入声明与 'ol'
的本地声明冲突
我真的不知道我该怎么办。
我刚开始使用 TS,这些错误并没有告诉我太多。
有什么建议吗?
好的,我找到了解决方案。
有一些问题。
- 首先是我不明白我的命名空间扩展将如何工作。我真的不知道我是否应该从我的 openlayers.ts 文件或全局 OpenLayers 参考中取消这些扩展。但是我多读了几次 TS 文档,我一直在寻找一些进入 Internet 的解决方案,阅读后我明白如果我想扩展一些命名空间——我必须像在原始库中一样取消那些扩展。它的工作方式类似于用 C# 编写的普通字符串或集合扩展。我没有取消 MyStringExtenstion.SomeMethod(myString)。我必须取消 myString.SomeMethod();
- 我没有将 OpenLayers 导入到我的 openlayers.ts 文件中 - 这是命名空间合并的强大功能 - 如果命名空间具有相同的名称 - 它将会被合并 - 仅此而已。所以我删除了
import ol = require('openlayers');
- 这个场景的最后一个问题是导出我的扩展命名空间。现在我正在考虑它,我明白它是多么愚蠢,因为如果我将我的名称空间与全局 OpenLayers 名称空间合并,我就不需要再导出它一次。我的命名空间进入了全局 OpenLayers 命名空间——仅此而已。所以我将
export declare namespace ol
更改为 declare namespace ol
.
我会把我的问题和答案留给有类似问题的人。我会让找到解决方案的速度比我找到的快得多。
我正在开发使用 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 {
...
}
但现在我有错误:
- (TS) 合并声明中的单独声明 'ol' 必须全部导出或全部本地。
- 在
ol.interaction.Pointer
- (TS) 属性 'Pointer' 类型 'typeof interaction' 上不存在。 - (TS) 导入声明与 'ol' 的本地声明冲突
我真的不知道我该怎么办。 我刚开始使用 TS,这些错误并没有告诉我太多。
有什么建议吗?
好的,我找到了解决方案。
有一些问题。
- 首先是我不明白我的命名空间扩展将如何工作。我真的不知道我是否应该从我的 openlayers.ts 文件或全局 OpenLayers 参考中取消这些扩展。但是我多读了几次 TS 文档,我一直在寻找一些进入 Internet 的解决方案,阅读后我明白如果我想扩展一些命名空间——我必须像在原始库中一样取消那些扩展。它的工作方式类似于用 C# 编写的普通字符串或集合扩展。我没有取消 MyStringExtenstion.SomeMethod(myString)。我必须取消 myString.SomeMethod();
- 我没有将 OpenLayers 导入到我的 openlayers.ts 文件中 - 这是命名空间合并的强大功能 - 如果命名空间具有相同的名称 - 它将会被合并 - 仅此而已。所以我删除了
import ol = require('openlayers');
- 这个场景的最后一个问题是导出我的扩展命名空间。现在我正在考虑它,我明白它是多么愚蠢,因为如果我将我的名称空间与全局 OpenLayers 名称空间合并,我就不需要再导出它一次。我的命名空间进入了全局 OpenLayers 命名空间——仅此而已。所以我将
export declare namespace ol
更改为declare namespace ol
.
我会把我的问题和答案留给有类似问题的人。我会让找到解决方案的速度比我找到的快得多。