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
由于该问题越来越受到批评,我对此进行了深入研究并设法理解了该功能。
希望这个答案有帮助。
该功能允许将项目的各个部分定义为单独的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)
让我们来看看这些变化:
/tsconfig.json到/tsconfig-base.json是一个非常重大的事情本身:根文件夹不是打字稿项目了,因为tsc需要tsconfig.json的文件存在。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。这可以通过两个非常明显的步骤完成:
// in /src/tsconfig.json
{
"extends": "../tsconfig-base.json",
"compilerOptions": {
// compiler options
"composite": true
}
}
Run Code Online (Sandbox Code Playgroud)// in /test/tsconfig.json
{
"extends": "../tsconfig-base.json",
"references": [
{ "path": "../src" }
]
}
Run Code Online (Sandbox Code Playgroud)该"include"阵列/tsconfig-base.json 是不是现在需要的,因为代码排除由“引新的边界”来完成。
现在,test项目需要存在项目*.d.ts文件src。这意味着在运行测试之前,src应该已经分别构建了。这是通过使用tsc由--build选项触发的的新模式完成的:
tsc --build src
Run Code Online (Sandbox Code Playgroud)
此命令将构建src项目,并将输出放入指定的输出文件夹(在本例中为/dist),而不会破坏test,也不会丢失任何编译错误。