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 中的配置来调整或扩展这些策略。
