为什么 `allowJS` 在我的编译输出中导致不需要的 `src` 子目录?

Why does `allowJS` cause an unwanted `src` subdirectory in my compiled output?

我正在将遗留 node/express 代码库转换为 TypeScript,遵循 Microsoft TypeScript starter 作为起始参考。

在此参考中,输出被编译为 dist,但是当在 tsconfig.json 中启用 allowJS 时,输出被发送到 dist/src - 这是为什么?

这是我的 tsconfig.json

{
"compilerOptions": {
  "module": "commonjs",
  "target": "es6",
  "noImplicitAny": false,
  "moduleResolution": "node",
  "sourceMap": true,
  "rootDir" : "./",
  "outDir": "dist",
  "baseUrl": ".",
  "allowJs": true,
  "paths": {
    "*": [
      "node_modules/*",
      "src/types/*"
    ]
  }
},
"include": [
  "src/**/*"
]

}

AllowJS

输出在 /dist 下正确映射,直到 allowJS 标志在 tsconfig.json 中打开,之后输出出现在 /dist/src

听起来您的编译器 (TSC) 配置文件可能比您希望转译器开始链接过程的位置高一个级别。您能否尝试将其降低一个级别并让我们知道会发生什么?

希望对您有所帮助。

这里发生了两件事:

  • Typescript 依赖 rootDir 来决定输出的目录结构(参见 this comment from Typescript's bossman)。
  • 只有 rootDir 内的代码可以被 tsc compiled/emitted。
  • 如果您没有明确设置 rootDir,它默认为 ./(相对于 tsconfig)...除非您包含了 [=14 之外的内容=] 需要 tsc compiled/emitted,在这种情况下,它会强制 rootDir 自动设置为包含所有源的目录。
  • allowJS 设置告诉 tsc.js 代码视为源并将其发送到 outDir

我怀疑当您启用 allowJS 时,在 src 之外有 .js 代码,tsc 现在必须发送到 outDir,因此它自动移动rootDir 更上一层楼。由于 src 现在是 rootDir 的子目录,这在 outDir.

中得到镜像

请参阅 this answer 以获取使您 src 保留 rootDir 并包含其外部代码的解决方案。