我最近在TypeScript圈子中正在阅读的是 namespace BAD 。但是,我发现将一组相关的声明封装在单个命名空间(有点像库)中,从而发现了实用程序和组织上的好处,而且我希望避免编写大量的import语句。
我了解使用 as 进行导入的功能,本质上允许命名间隔,例如
import * as NS from '../some/module'
但是,我认为这很麻烦,并且如果需要重构NS(在上面的示例中),可能会变得凌乱。
因此,我的策略将在下面简要说明。但是,我从中感觉到一种骇人听闻的感觉,引起了我可能不曾预料到的负面后果的担忧。
给出以下文件夹结构
.
└── doc
├── doc.ts
├── impl.ts
├── exports.ts
└── index.ts
doc.ts
export enum Type {
A = "A",
B = "B"
}
export interface IDoc {
type: Type;
}
impl.ts
import { IDoc, Type } from "./doc";
export class Impl implements IDoc {
constructor(public type: Type) {
}
}
exports.ts 导出所有内容
export * from "./impl";
export * from "./doc";
index.ts ,然后将“导出”重新导出为 Doc :
import * as Doc from "./exports";
export { Doc };
例如,我有一个一致的导入
import { Doc } from "../core/doc";
export class SomeClass {
doc: Doc.IDoc;
constructor(type: Doc.Type) {
this.doc = new Doc.Impl(type);
}
}
此策略的陷阱是什么?我是否缺少最佳实践或模式?
答案 0 :(得分:2)
您没有使用命名空间。这种技术称为 barrelling 。
命名空间通常内置于该语言中,并提供了一种唯一标识一组“蓝图”的方法,例如类,接口等。
另一方面,发泄是您正在做的事情。桶状包装将一堆导出成员包装成一个导入。这是一种不错的技术,可能会因您的工作而被其他人推荐。虽然,此技术也可能导致您陷入称为循环依赖的问题。 循环依赖是两个或多个模块之间的关系,这些模块直接或间接依赖彼此以正常运行。
桶装时只需要小心即可。您可能还想考虑完全不这样做,并在每个文件中专门导入所需的内容,以避免循环依赖。