通过TypeScript中的重新导出合并导出的陷阱是什么

时间:2019-12-19 21:01:05

标签: angular typescript

我最近在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);
  }
}

此策略的陷阱是什么?我是否缺少最佳实践或模式?

1 个答案:

答案 0 :(得分:2)

您没有使用命名空间。这种技术称为 barrelling

命名空间通常内置于该语言中,并提供了一种唯一标识一组“蓝图”的方法,例如类,接口等。

另一方面,

发泄是您正在做的事情。桶状包装将一堆导出成员包装成一个导入。这是一种不错的技术,可能会因您的工作而被其他人推荐。虽然,此技术也可能导致您陷入称为循环依赖的问题。 循环依赖是两个或多个模块之间的关系,这些模块直接或间接依赖彼此以正常运行。

桶装时只需要小心即可。您可能还想考虑完全不这样做,并在每个文件中专门导入所需的内容,以避免循环依赖。