【发布时间】:2018-10-15 22:22:49
【问题描述】:
TL;DR
不导出命名空间,只声明它,我想访问其中的枚举。转译后,命名空间不可访问(它是一个未定义的对象),因此无法访问枚举(命名空间出错)。
说明
我正在 TypesScript 中设置一个项目,并且我想避免导入特定于该项目的所有定义。在这个 sn-p 中,我创建了一个命名空间,用于放置我的 redux 逻辑的本地定义。
redux 声明的摘录(redux.d.ts):
declare namespace Redux {
namespace Actions {
enum TypeKeys {
REDUX_INIT = '@@redux/INIT',
BOOTSTRAP = 'BOOTSTRAP',
CORPUS_LOADED = 'CORPUS_LOADED',
...
}
...
interface Definition {
doSomething(): void;
...
}
...
}
namespace Store {
interface Definition { ... }
...
}
}
这让我可以避免在我的所有代码中导入定义(例如,在我的顶级组件中的 const mapStateToProps = (state: Redux.Store.Definition) => state; 中,我不必导入任何 Redux 命名空间)。
转向问题,我写了这个reducer(corpusReducer.ts摘录):
// Note: no need to import Redux!
export default (state: Redux.Store.CorpusManagement, action: Redux.Actions.ActionTypes): Redux.Store.CorpusManagement => {
switch (action.type) {
case Redux.Actions.TypeKeys.CORPUS_LOADED:
return { corpus: action.payload };
default:
return state === undefined ? { corpus: { documents: [] } } : state;
}
};
转译后,我收到错误 ReferenceError: Redux is not defined 对于行 case Redux.Actions.TypeKeys.CORPUS_LOADED。
我怀疑Redux 在运行时不可用,因为命名空间属于 TypeScript 世界。 TypeKeys,另一方面,它是一个枚举,它应该在 JavaScript 中有一个映射,因此我的预期行为是该枚举在转译后仍然可以访问。
如果我添加一个导出(将行更改为declare namespace Redux),该文件被“提升”为一个模块,但是我需要在我的代码中的任何地方导入它。
问题
如何避免使用 export 子句访问枚举(因此要在任何地方显式导入模块)?有什么好的做法我没有遵循吗?
【问题讨论】:
标签: typescript