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
让我们来看看这些变化:
- 将
/tsconfig.json
重命名为/tsconfig-base.json
本身就是一件非常重要的事情:根文件夹不再是TypeScript项目,因为tsc
要求tsconfig.json
文件存在.
- 另一方面,添加
src/tsconfig.json
和test/tsconfig.json
文件会将src
和test
变成两个独立的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
依赖于src
,test
必须以某种方式"知道"src
.这可以通过两个非常明显的步骤来完成:
/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
,也不丢失任何编译错误.