TypeScript编译器是否应在"main"旁查找类型定义?
TypeScript tsc 的 Node 模块解析策略详解
作为天天跟TypeScript打交道的人,我把tsc采用的Node模块解析流程给你拆解得明明白白,完全贴合官方规范:
核心搜索流程(针对非相对路径导入,比如import lodash from 'lodash')
- 从当前导入语句所在的文件目录开始,逐层向上遍历文件系统,每一层都会检查是否存在
node_modules目录 - 一旦找到
node_modules,就进去查找和包名完全匹配的子目录(比如lodash目录) - 进入包的根目录后,优先查找根目录下的
.ts、.tsx或.d.ts文件;如果没找到这些,会读取该目录下的package.json,解析其中的types或typings字段,加载指定路径的类型定义文件
找不到类型定义时的 fallback 逻辑
- 如果上面的步骤都没捞到类型定义,tsc会尝试加载包根目录下的
index.ts、index.tsx或index.d.ts(这是Node模块的默认入口约定) - 要是连这些入口文件都没有,它会转而尝试加载包的JavaScript入口(比如
index.js),同时自动生成一个临时的any类型定义——这时候代码不会报错,但你也得不到任何类型提示,相当于“裸奔”用包 - 最后,如果连JS文件都找不到,tsc就会直接抛出错误:
Cannot find module 'xxx' or its corresponding type declarations
小技巧
如果你想杜绝这种“隐式any”的情况,强制要求所有依赖都有类型定义,可以在tsconfig.json里开启:
{ "compilerOptions": { "noImplicitAny": true, "strict": true // 开启strict会包含noImplicitAny,更推荐 } }
内容的提问来源于stack exchange,提问作者Kevin Peters
相关产品推荐
相关产品推荐

