101

我怎样才能引入类似的东西'my-app-name/services'来避免像下面的导入那样的行?

import {XyService} from '../../../services/validation/xy.service';
4

3 回答 3

143

打字稿 2.0+

在 TypeScript 2.0 中,您可以baseUrl在以下位置添加属性tsconfig.json

{
    "compilerOptions": {
        "baseUrl": "."
        // etc...
    },
    // etc...
}

然后,您可以像在基本目录中一样导入所有内容:

import {XyService} from "services/validation/xy.service";

在此之上,您可以添加一个paths属性,它允许您匹配一个模式然后将其映射出来。例如:

{
    "compilerOptions": {
        "baseUrl": ".",
        "paths": {
            "services/*": [
                "services/validation/*"
            ]
        }
        // etc...
    },
    // etc...
}

这将允许您从任何地方导入它,如下所示:

import {XyService} from "services/xy.service";

从那里,您将需要配置您使用的任何模块加载器以支持这些导入名称。现在 TypeScript 编译器似乎并没有自动映射出这些。

您可以在github issue中阅读更多相关信息。还有一个rootDirs属性在使用多个项目时很有用。

Pre TypeScript 2.0(仍然适用于 TS 2.0+)

我发现使用"barrels"可以使其变得更容易。

  1. 在每个文件夹中,创建一个index.ts文件。
  2. 在这些文件中,重新导出文件夹中的每个文件。

例子

在您的情况下,首先创建一个名为my-app-name/services/validation/index.ts. 在这个文件中,有代码:

export * from "./xy.service";

然后创建一个名为my-app-name/services/index.ts并具有以下代码的文件:

export * from "./validation";

现在您可以像这样使用您的服务(index暗示):

import {XyService} from "../../../services";

一旦你有多个文件,它就会变得更加容易:

import {XyService, MyOtherService, MyOtherSerivce2} from "../../../services";

必须维护这些额外的文件需要更多的前期工作(可以使用bucket-maintainer消除这些工作),但我发现它最终以更少的工作得到了回报。进行主要的目录结构更改要容易得多,并且可以减少您必须执行的导入次数。

警告

执行此操作时,您必须注意一些事情并且不能做:

  1. 你必须注意循环再出口。因此,如果两个子文件夹中的文件相互引用,那么您需要使用完整路径。
  2. 您不应该从同一个原始文件夹返回文件夹(例如,在验证文件夹中的文件中并执行import {XyService} from "../validation";)。我发现了这一点,第一点可能导致未定义导入错误。
  3. 最后,您不能在同名的子文件夹中有两个导出。通常这不是问题。
于 2016-01-21T14:38:22.527 回答
18

最好在 tsconfig.json 中使用以下配置

{
  "compilerOptions": {
    "...": "reduced for brevity",

    "baseUrl": "src",
    "paths": {
      "@app/*": ["app/*"]
    }
  }
}

Angular 6 之前的传统方式:

`import {XyService} from '../../../services/validation/xy.service';`

应该重构为这些:

import {XyService} from '@app/services/validation/xy.service

又短又甜!

于 2018-04-10T15:01:25.340 回答
2

我刚遇到这个问题。我知道它现在已经回来了,但是对于遇到它的任何人来说,都有一个更简单的答案。

我遇到这种情况只是因为我长期以来一直在做的事情停止了工作,我想知道 Angular 7 中是否发生了一些变化。不,这只是我自己的代码。

无论如何,我只需要更改一行tsconfig.json即可避免长导入路径。

{
  "compilerOptions": {
  "...": "simplified for brevity",

   "baseUrl": "src"
  }
}

例子:

// before:
import {XyService} from '../../../services/validation/xy.service';

// after:
import { XyService } from 'app/services/validation/xy.service';

自从 Angular-CLI 出现以来,这几乎对我有用。

于 2019-02-04T23:13:44.707 回答