pending

    当 TypeScript (TS) 开始解析项目中的文件时,它主要遵循以下规则:

    1. tsconfig.json

    TS 首先查找项目根目录中的 tsconfig.json。如果找到,它将使用这里定义的配置选项来指导解析和编译过程。tsconfig.json 可以使用 include、exclude 和 files 属性来明确指定哪些文件应该被编译。

    1. 模块解析策略

    TypeScript 使用模块解析策略来找到模块和类型定义文件。两种主要的策略是 Classic 和 Node。默认情况下,TS 使用 Node 策略,模拟 Node.js 的模块解析机制。

    1. 查找声明文件

    对于每一个 JavaScript 文件(.js),TypeScript 会查找一个相应的声明文件(.d.ts)。例如,对于 example.js 文件,TypeScript 会尝试查找 example.d.ts。

    1. Ambient Modules

    当你在 TS 中使用像 import x from "y" 这样的导入形式,但没有为 “y” 提供相应的类型,TS 会查找 “y” 的 Ambient Module。你可以在一个 .d.ts 文件中声明它,例如 declare module "y" { ... }。这告诉 TS 不要检查 “y”,而是使用这里的声明。

    1. @types

    如果你的项目使用了 npm 的第三方库,并且这些库没有自带类型声明,TypeScript 会去 node_modules/@types 文件夹中查找。许多常见的 JavaScript 库的类型定义可以通过 npm 安装,例如 npm install @types/lodash。

    1. Triple-Slash Directives

    这是一种特殊的指令,可以直接在 TypeScript 文件中使用,例如 /// <reference types="..." />。虽然这不是推荐的方式,但在某些情况下它可能是有用的。

    1. 查找顺序

    当你导入模块时,例如 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
    1. 解析失败

    如果 TS 不能解析模块,它会生成一个错误。你可以通过引入类型声明或修改 tsconfig 解决这些错误。

    要理解 TypeScript 如何解析文件,最重要的是理解它遵循与 Node.js 类似的模块解析策略,并使用 tsconfig.json 中的配置来调整或扩展这些策略。