TypeScript 3.0中有一个叫做Project References的新特性.这表明*.ts个模块之间的交互更好.不幸的是,我只能从官方文件中得到这些? 虽然它似乎写得非常清楚和直白.

有谁能帮我确切地理解,它解决了什么问题,它是如何做到的,我将如何从中受益?我有一个类似 struct 的项目,所以它可能(也可能不是)对它很有帮助.提前谢谢!


UPD:项目 struct 大致如下:

project/
    lib/
        index.ts # defines the original code
    test/
        index.spec.ts # requires lib/index.ts
    package.json
    tsconfig.json

推荐答案

TL;DR:

该功能允许将项目的各个部分定义为单独的TypeScript模块.除此之外,这允许以不同的方式配置这些模块,单独构建它们,等等.


Before

最初,简化后的project structure与此类似:

/
    src/
        entity.ts # exports an entity
    test/
        entity.spec.ts # imports an entity
    tsconfig.json

一个实体是defined in src/entity.ts module,然后是used in test/entity.spec.ts file

请注意,这里只有一个tsconfig.json文件,位于根文件夹中.这基本上是说这个文件夹包含一个大的solid TypeScript项目.这个项目包括几个文件夹中的文件;其中一些文件用于测试其他文件.

然而,这种 struct 带来了一个问题:编译项目(即tsc个)的过程也会编译测试文件,从而在输出中创建dist/test/entity.spec.{js|d.ts}个文件.这种情况不应该发生,因此tsconfig.json文件被稍微修改,只包括那些供外部使用的文件/文件夹:

{
    "compilerOptions": {
        // compiler options
    },
    "include": [
        "./src"
    ]
}

这解决了问题,但在我的例子中,它也导致了在开发过程中,TypeScript编译器偶尔会忽略/test文件夹中的所有文件.而且,这种排他性的方法可能并不适合所有人.


After

utilizing the feature年后,项目 struct 改变为:

/
    src/
        entity.ts # exports an entity
        tsconfig.json
    test/
        entity.spec.ts # imports an entity
        tsconfig.json
    tsconfig-base.json

让我们来看看这些变化:

  1. /tsconfig.json重命名为/tsconfig-base.json本身就是一件非常重要的事情:根文件夹不再是TypeScript项目,因为tsc要求tsconfig.json文件存在.
  2. 另一方面,添加src/tsconfig.jsontest/tsconfig.json文件会将srctest变成两个独立的TypeScript项目,彼此独立.

/{src|test}/tsconfig.json个文件的内容类似,因为预期配置不会发生任何变化,即"严格性"、输出文件夹以及其他此类参数都应保留.为了使它们相似而不复制粘贴任何东西,all the configurations are put in an arbitrary file,从两个地方都可以访问;在这种情况下,根文件夹中的tsconfig-base.json被选中:

// the contents of /tsconfig-base.json
{
    "compilerOptions": {
        // compiler options, common to both projects
    }
}

This file is being "inherited" then x /{src|test}/tsconfig.json个文件,如果需要,添加任何其他选项:

// the contents of /{src|test}/tsconfig.json
{
    "extends": "../tsconfig-base.json",
    "compilerOptions": {
        // additional compiler options, specific to a project
    }
}

请注意,这种模式类似于定义一个实现不完整的abstract class,然后通过两个独立的"具体"类对其进行扩展.

现在,/src/test文件夹基本上包含两个具有类似配置的独立TypeScript项目.最后一件事是指定两者之间的关系.由于test依赖于srctest必须以某种方式"知道"src.这可以通过两个非常明显的步骤来完成:

  • 从外部将其声明为"复合":

    // in /src/tsconfig.json
    {
        "extends": "../tsconfig-base.json",
        "compilerOptions": {
            // compiler options
            "composite": true
        }
    }
    
  • reference src from test:

/tsconfig-base.json is not needed now中的"include"数组,因为代码排除是通过"绘制新边界"完成的.

UPDATE: the following section seems to be outdated since 100

现在,test项目需要*.d.ts个文件才能显示src项目.这意味着在运行测试之前,src应该已经单独构建好了.这个选项是由using the new mode of tsc触发的:

tsc --build src

此命令生成src项目,并将输出放在指定的输出文件夹(在本例中为/dist)中,既不中断test,也不丢失任何编译错误.

Typescript相关问答推荐

Angular 17 -如何在for循环内创建一些加载?

在这种情况下,如何获得类型安全函数的返回值?

在TypeScript中,除了映射类型之外还使用的`in`二进制运算符?

键集分页顺序/时间戳上的筛选器,精度不相同

如何通过TypeScript中的工厂函数将区分的联合映射到具体的类型(如类)?

基于键的值的打字动态类型;种类;

如何在TypeScrip中从字符串联合类型中省略%1值

如何在typescript中设置对象分配时的键类型和值类型

STypescript 件的标引签名与功能签名的区别

限制返回联合的TS函数的返回类型

以Angular 执行其他组件的函数

在VSCode中显示eslint错误,但在终端中运行eslint命令时不显示?(Vite,React,TypeScript)

错误:NG02200:找不到类型为';对象';的其他支持对象';[对象对象]';.例如数组

无法缩小深度嵌套对象props 的范围

更漂亮的格式数组<;T>;到T[]

React中的效果挂钩在依赖项更新后不会重新执行

可选通用映射器函数出错

基于可选参数的动态类型泛型类型

对象可能未定义(通用)

从接口推断模板参数?