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

hlf*_*rmn 4 architecture dependencies typescript

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

鉴于此项目结构:

project/
??? node_modules/
??? test/
??? src/
?   ??? domain/
?   ?   ??? SomeModelClass.ts
?   ??? application/
?   ?   ??? SomeApplicationConcern.ts
?   ??? database/
?   ?   ??? SomeRepository.ts
??? tsconfig.json
??? tslint.json
Run Code Online (Sandbox Code Playgroud)

我想至少执行以下一些规则:

  • SomeApplicationConcern 可以从任何地方导入代码。
  • SomeRepository不能导入代码application
  • SomeModelClass不能从进口既不代码application也不是domain

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

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

Sco*_*son 17

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

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


Mat*_*hen 6

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

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