关注公众号
关注公众号
与我交流
与我交流
购买此书
购买此书

tsconfig.json 的行为

为什么把一个文件放入「exclude」选项中,它仍然会被编译器选中?

tsconfig.json 将会把一个文件夹转换为「项目」,如果不指定任何 exclude 或者 files,则包含在 tsconfig.json 中的所有文件夹中的所有文件都会被包含在编译中。

如果你想忽略一些文件,使用 exclude。如果希望指定所有文件,而不是让编译器查找它们,请使用 files

这些行为,tsconfig.json 将会自动确认。但是这有一个不同的问题,即是解析模块。模块解析:编译器将尝试去理解 ns 在模块语法中表示什么,即 import * as ns from 'mod'。为了理解它,编译器需要定义一个模块,它可能是包含你自己代码的 .ts 文件,或者是导入的一个 .d.ts 文件。如果一个文件被找到,则无论它是否在 excludes 中,它都将会被编译。

因此,如果你想从编译中排除一个文件,你需要排除所有具有 import 或者 <reference path="..."> 指令的文件。

使用 tsc --listFiles 来列出在编译时包含了哪些文件,tsc --traceResolution 来看看它们为什么会被包含在编译中。

我怎么指定一个 include

现在无法在 tsconfig.jsoninclude 选项外指定所需要包含的文件。你可以通过以下任意一种方式获得相同的结果:1 使用 files 列表,2 在目录中添加 ///<reference path=""> 指令。

当我使用 JavaScript 文件时,为什么我会得到 error TS5055: Cannot write file 'xxx.js' because it would overwrite input file 错误?

对于 TypeScript 文件来说,在默认情况下,编译器将在同一目录中生成与 JavaScript 相同文件名的文件。因为 TypeScript 文件与编译后的文件总是拥有不同的后缀,这么做是安全的。然而,如果你设置 allowJs 编译选项为 true 和没有设置任何的编译输出属性(outFileoutDir),编译器将会尝试使用相同的规则来编译文件,这将导致发出的 JavaScript 文件与源文件具有相同的文件名。为了避免意外覆盖源文件,编译器将会发出此警告,并跳过编写输出文件。

有多种方法可以解决此问题,但所有这些方法都涉及配置编译器选项,因此建议你在项目根目录中的 tsconfig.json 文件来启用此功能。如果你不想编译 JavaScript 文件,你只需要将 allowJs 选项设置为 false;如果你确实想要包含和编译这些 JavaScript 文件,你应该设置 outDir 或者 outFile 选项,定向到其他位置,这样他们就不会与源文件冲突。如果你仅仅是想包含这些 JavaScript 文件,但是不需要编译,设置 noEmit 选项为 true 可以跳过编译检查。