我可以在TypeScript中同时导入和导出同名类和名称空间吗?

时间:2019-10-25 07:25:29

标签: typescript namespaces typescript-typings typescript-namespace

考虑文件ExampleUtil中的类(例如ExampleUtil.ts)。当前ExampleUtil使用的类型,存储在文件ExampleUtil__TYPES.ts中。将它们导入ExampleUtil.ts没问题;当前,不需要名称空间。

当我开始在其他项目中使用ExampleUtil时,发现ExampleUtil__TYPES.ts中的类型是上下文相关的,最好将它们封装到名称空间中。但是,名称ExampleUtil已被类使用,因此我需要为命名空间选择其他名称,或通过其他方法解决此冲突。

在我的图书馆中,我将类型定义组织为:

import ExampleUtil from "./ExampleUtil/ExampleUtil";
import { Type1, Type2 } from "./ExampleUtil/ExampleUtil__TYPES"
import OtherUtil from "./OtherUtil/OtherUtil";
import { Type3, Type4 } from "./OtherUtil/OtherUtil__TYPES"
// other classes, types and functions from library


/** Re-export for other project.
 *  Unlike "lodash", where each function is in separate file, herewith 
 *  all files are in same directory, here the developers can organize source files
 *  by directories, but users does not need to know these directories, because 
 *  they can get everything what they need from single "my-lib.js" file like below:
 *  import { ExampleUtil, Type1, Type2 } from "my-lib";
 *  All "my-lib" classes and functions those has not been used, will not be included
 *  by Webpack to production bundle.
 */
export {
  ExampleUtil, Type1, Type2,
  OtherUtil, Type3, Type4,
  // ... other classes, types and functions from library
};

如果我们不包装Type1Type2,而没有命名空间ExampleUtil,则冲突将在my-lib.d.ts中发生:我们是导入类和同名命名空间,然后我们都需要重新导出。

所以,我可以像这样写代码

//                               ? Namespace
const parameterForExampleUtil: ExampleUtil.Type1 = { /* ... */ };
//            ? Namespace        ? Class
const result: ExampleUtil.Type2 = ExampleUtil.getSomething(parameterForExampleUtil);

,如果没有,我可以为命名空间选择哪个名称?其他编程语言的一些好的做法可以避免类名和相应名称空间之间的冲突?我知道对接口使用前缀I,这种做法是否适用于命名空间?

0 个答案:

没有答案