打字稿阻止从项目中的某些目录导入

时间:2018-09-30 16:08:51

标签: typescript architecture dependencies

我想知道是否有一种方法可以防止某个范围内的所有文件从另一个第二范围导入任何文件。示例:

给出以下项目结构:

project/
├── node_modules/
├── test/
├── src/
│   ├── domain/
│   │   ├── SomeModelClass.ts
│   ├── application/
│   │   ├── SomeApplicationConcern.ts
│   ├── database/
│   │   ├── SomeRepository.ts
├── tsconfig.json
└── tslint.json

我想至少执行其中一些规则:

  • SomeApplicationConcern可以从任何地方导入代码。
  • SomeRepository可以不能application
  • 导入代码
  • SomeModelClass不能不能applicationdomain导入代码。

使用嵌套的tsconfig.json文件可以通过某种方式实现吗?
可以使用一些花哨的tslint规则来实现吗?

我不知道是否有可能这样做。如果检测到禁止的依赖关系,我想得到一个编译错误(或tslint错误,在我的项目中设置为 error 严重性)。

2 个答案:

答案 0 :(得分:5)

一些基于快速在线研究的想法:

  1. good-fences是专用工具,用于限制TypeScript项目中的导入。您必须将其作为一个单独的步骤添加到构建过程中。
  2. module设置为es6的情况下编译TypeScript代码(如果需要其他module设置来生成实际运行的代码,则将其编译到单独的输出目录中),然后使用输出上的no-restricted-imports rule
  3. 同时设置运行时环境和tsconfig.json,以便只能使用非相对导入,然后使用tslint-microsoft-contrib中的no-relative-imports规则。但是,有talk of deprecating no-relative-imports
  4. 编写您自己基于ESLint的基于TSLint的no-restricted-imports的重新实现,并将其贡献给tslint-eslint-rules

答案 1 :(得分:2)

听起来 Dependency Cruiser 是您正在寻找的工具。您可以将任何您想要的任意规则放在一起,在构建过程中运行它,它会自动报告依赖项违规。它支持 typescript、javascript、commonjs、es6 模块等。

实际上,我一直在寻找这个确切问题的答案,直到最近才偶然发现了这个工具。希望其他人也能发现它很有用。