如何在TypeScript 3.0中使用项目引用?

Dmi*_*sky 25 module typescript

TypeScript 3.0中有一个名为Project References的新功能.它表明*.ts模块之间更好的交互.不幸的是,这是我从官方文档中得到的全部内容,尽管它似乎写得非常清楚和直接.

任何人都可以帮助我准确理解,它解决了什么问题,它是如何做到的,以及我将如何从中受益?我有一个类似结构的项目,所以它可能(或可能不)对它非常有帮助.先感谢您!


UPD:项目结构大致如下:

project/
    lib/
        index.ts # defines the original code
    test/
        index.spec.ts # requires lib/index.ts
    package.json
    tsconfig.json
Run Code Online (Sandbox Code Playgroud)

Dmi*_*sky 33

由于该问题越来越受到批评,我对此进行了深入研究并设法理解了该功能。
希望这个答案有帮助。


TL; DR:

该功能允许将项目的各个部分定义为单独的TypeScript模块。除其他事项外,这允许对这些模块进行不同的配置,分别构建等。


之前

最初,简化后的项目结构类似于以下内容:

/
    src/
        entity.ts # exports an entity
    test/
        entity.spec.ts # imports an entity
    tsconfig.json
Run Code Online (Sandbox Code Playgroud)

实体在src/entity.ts模块中定义,然后在test/entity.spec.ts文件中使用。

请注意,这里只有一个tsconfig.json文件位于根文件夹中。这基本上表示该文件夹包含一个大型固体TypeScript项目。该项目包括几个文件,按文件夹组织;其中一些文件用于测试其他文件。

但是,这种结构会带来一个问题:编译项目的过程(即tsc)还会编译测试文件,从而dist/test/entity.spec.{js|d.ts}在输出中创建文件。不应发生这种情况,因此对该tsconfig.json文件进行了少许更改,以仅包括那些供外部使用的文件/文件夹:

{
    "compilerOptions": {
        // compiler options
    },
    "include": [
        "./src"
    ]
}
Run Code Online (Sandbox Code Playgroud)

这解决了问题,但就我而言,这还导致/testTypeScript编译器在开发过程中偶尔会忽略文件夹中的所有文件。同样,这种专有方法可能并不适合所有人。


后

之后利用特征,项目结构发生了变化,以这样的:

{
    "compilerOptions": {
        // compiler options
    },
    "include": [
        "./src"
    ]
}
Run Code Online (Sandbox Code Playgroud)

让我们来看看这些变化:

  1. 重命名/tsconfig.json到/tsconfig-base.json是一个非常重大的事情本身:根文件夹不是打字稿项目了,因为tsc需要tsconfig.json的文件存在。
  2. 在另一方面,添加src/tsconfig.json和test/tsconfig.json档案都轮流src和test分成两个独立的打字稿项目,相互独立。

/{src|test}/tsconfig.json文件的内容类似,因为预期不会进行任何配置更改,即应保留“严格性”,输出文件夹以及其他此类参数。为了使它们相似而不复制粘贴,所有配置都放在一个可从两个位置访问的任意文件中;在这种情况下,已tsconfig-base.json为此选择了根文件夹中的:

// the contents of /tsconfig-base.json
{
    "compilerOptions": {
        // compiler options, common to both projects
    }
}
Run Code Online (Sandbox Code Playgroud)

然后通过/{src|test}/tsconfig.json文件“继承”此文件,并在需要时添加任何其他选项:

// the contents of /{src|test}/tsconfig.json
{
    "extends": "../tsconfig-base.json",
    "compilerOptions": {
        // additional compiler options, specific to a project
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此模式与定义abstract class具有不完整实现的,然后通过两个单独的“具体”类扩展它的方式相似。

现在,/src和/test文件夹基本上包含两个具有类似配置的独立TypeScript项目。最后要做的是指定两者之间的关系。既然test依赖src,就test不得不以某种方式“知道” src。这可以通过两个非常明显的步骤完成:

该"include"阵列/tsconfig-base.json 是不是现在需要的,因为代码排除由“引新的边界”来完成。

现在,test项目需要存在项目*.d.ts文件src。这意味着在运行测试之前,src应该已经分别构建了。这是通过使用tsc由--build选项触发的的新模式完成的:

tsc --build src
Run Code Online (Sandbox Code Playgroud)

此命令将构建src项目,并将输出放入指定的输出文件夹(在本例中为/dist),而不会破坏test,也不会丢失任何编译错误。

  • 我希望官方文档如此清晰。谢谢! (6认同)
  • 您可以在测试目录中显示实际代码吗?这里的path是重要的,就像我们从path中导入{myFunction}一样。感觉这个答案缺少了至关重要的部分。 (3认同)
  • 仍然没有导入的例子。仅有 gitlab 的链接是不够的。 (3认同)
  • 感谢您花时间写这篇文章,德米特里,我很欣赏您的见解。 (2认同)
  • @ChrisFremgen 我不完全确定到底缺少什么。是“export”和“import”语句的用法吗?如果是这样,则**不改变**;选择加入项目引用不会改变该语法。我认为这是显而易见的,只是创建了一个链接,而不是复制代码。如果您仍然认为代码应该直接出现在答案中,请告诉我 (2认同)
  • 所以...项目引用与模块解析无关,对吗?这只是为了通过告诉编译器“我依赖项目 A,如果它是最新的,我们可以走得更快”来减少编译时间? (2认同)