TypeScript 项目 `rootDir` 设置及根目录之外资源的引用
TypeScript 项目 rootDir 设置及根目录之外资源的引用
控制输出目录的层级
假设项目目录结构如下:
.
├── dest
├── node_modules
├── package.json
├── src
│ ├── index.ts
├── tsconfig.json
└── yarn.lock
在 "outDir": "./dest" 配置情况下,src/index.ts 编译后输出位置为 dest/src/index.js。
输出目录带上了的 src 这一层,显然不是那么合理。
解决办法是指定 rootDir: “src”。这样,根目录变成了 src,编译后输出则没有了 src 这一层。
根目录之外资源的引用
但,这样做存在局限性。因为根目录设置为 src 后,就限制了代码使用 src 之外资源的能力。
什么意思呢,假设我们想在 src/index.ts 中引用项目根目录的 package.json 文件,
src/index.ts
import * as pkg from "../package.json";
TypeScript 中导入 JSON 文件需要添加 resolveJsonModule : true 配置。好的。
加上后发现,会提示如下错误:
File ‘/myapp/package.json' is not under 'rootDir' ‘/myapp/src'. 'rootDir' is expected to contain all source files.ts(6059)
因为前面我们配置了 src 为根目录,而 package.json 并不在 src 下面,所以代码中引用就越界了,这就是前面说的局限性。
自定义声明文件
那为了解决这个问题,把刚刚添加的 resolveJsonModule : true 去掉或者改成 resolveJsonModule : false。
接下来在 src 下添加类型声明文件以支持 JSON 的导入,即,通过自定义声明的方式让 TypeScript 认识 JSON 文件而不用原生的配置。
src/typings.d.ts
declare module "*.json";
这样,完美解决。
最后的项目目录会长这样:
.
├── dest
│ ├── index.js
│ └── package.json
├── node_modules
├── package.json
├── src
│ ├── index.ts
│ └── typings.d.ts
├── tsconfig.json
└── yarn.lock