pending

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

    1. tsconfig.json

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

    1. 模块解析策略

    TypeScript 使用模块解析策略来找到模块和类型定义文件。两种主要的策略是 ClassicNode。默认情况下,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 中的配置来调整或扩展这些策略。