pending
当 TypeScript (TS) 开始解析项目中的文件时,它主要遵循以下规则:
- tsconfig.json
TS 首先查找项目根目录中的 tsconfig.json
。如果找到,它将使用这里定义的配置选项来指导解析和编译过程。tsconfig.json
可以使用 include
、exclude
和 files
属性来明确指定哪些文件应该被编译。
- 模块解析策略
TypeScript 使用模块解析策略来找到模块和类型定义文件。两种主要的策略是 Classic
和 Node
。默认情况下,TS 使用 Node
策略,模拟 Node.js 的模块解析机制。
- 查找声明文件
对于每一个 JavaScript 文件(.js
),TypeScript 会查找一个相应的声明文件(.d.ts
)。例如,对于 example.js
文件,TypeScript 会尝试查找 example.d.ts
。
- Ambient Modules
当你在 TS 中使用像 import x from "y"
这样的导入形式,但没有为 “y” 提供相应的类型,TS 会查找 “y” 的 Ambient Module。你可以在一个 .d.ts
文件中声明它,例如 declare module "y" { ... }
。这告诉 TS 不要检查 “y”,而是使用这里的声明。
- @types
如果你的项目使用了 npm 的第三方库,并且这些库没有自带类型声明,TypeScript 会去 node_modules/@types
文件夹中查找。许多常见的 JavaScript 库的类型定义可以通过 npm 安装,例如 npm install @types/lodash
。
- Triple-Slash Directives
这是一种特殊的指令,可以直接在 TypeScript 文件中使用,例如 /// <reference types="..." />
。虽然这不是推荐的方式,但在某些情况下它可能是有用的。
- 查找顺序
当你导入模块时,例如 import {a} from './moduleA'
,TS 会尝试按以下顺序解析 moduleA
:
- 尝试找
moduleA.ts
- 尝试找
moduleA.tsx
- 尝试找
moduleA.d.ts
- 尝试查找
moduleA/package.json
中的"types"
字段指向的文件 - 尝试找
moduleA/index.ts
- 尝试找
moduleA/index.tsx
- 尝试找
moduleA/index.d.ts
- 解析失败
如果 TS 不能解析模块,它会生成一个错误。你可以通过引入类型声明或修改 tsconfig 解决这些错误。
要理解 TypeScript 如何解析文件,最重要的是理解它遵循与 Node.js 类似的模块解析策略,并使用 tsconfig.json
中的配置来调整或扩展这些策略。