TypeScript子tsconfig继承根配置时无法正确识别根目录下的types.d.ts文件
TypeScript子tsconfig继承根配置时无法正确识别根目录下的types.d.ts文件
我太懂这种闹心的情况了——本来想用父tsconfig统一配置减少重复,结果偏偏在types.d.ts的路径上掉坑!咱们先拆解下问题根源,再给你几个不用重复配置的解决方案:
问题根源
TypeScript在处理子tsconfig继承的types数组时,对相对路径的解析逻辑和baseUrl、paths不一样:
- 像
baseUrl这类配置,子tsconfig继承后会自动基于自身所在目录调整基准路径 - 但
types数组里的相对路径(比如你根配置里的./types.d.ts),会被直接当成相对于子tsconfig所在目录的路径来解析,不会自动转换为相对于根目录的路径,这就是为什么你在ui目录下跑bun tsc --showConfig时,看到的还是./types.d.ts(对应ui目录下的位置,而不是根目录)
不用重复配置的解决方案
方案1:用基于baseUrl的绝对路径(推荐)
这个方案完美符合你不想重复配置的需求:
- 确保根tsconfig的
baseUrl设置为./(指向根目录),如果还没加的话:{ "compilerOptions": { "baseUrl": "./", // 其他配置... } } - 把根tsconfig里的
types数组修改为非相对路径的形式:
原理是:当"types": ["bun-types", "types"]types数组里用的是非相对路径时,TypeScript会基于baseUrl指定的目录(根目录)去寻找对应的types.d.ts文件,子tsconfig继承这个配置后,会自动沿用这个解析逻辑,不会再按相对路径去子目录找。
方案2:用typeRoots自动扫描根目录的.d.ts文件
如果你的根目录下只有types.d.ts这一个自定义类型文件,或者想让TypeScript自动扫描根目录下所有自定义类型文件,可以试试这个:
在根tsconfig里设置typeRoots,替代原来的types数组:
"compilerOptions": { "typeRoots": ["./node_modules/@types", "./"], // 其他配置... }
这样TypeScript会自动扫描./node_modules/@types(默认的类型目录)和根目录下的所有.d.ts文件,子tsconfig继承后也会沿用这个扫描规则,不用单独指定types数组。
方案3:临时应急的覆盖配置(不推荐,除非前两个不适用)
如果上面两个方案都不符合你的场景,那可以在子tsconfig里只覆盖types数组,把路径改成相对于子目录的正确路径:
{ "extends": "../tsconfig.json", "compilerOptions": { "types": ["bun-types", "../types.d.ts"] } }
不过这个确实有点违背DRY原则,只能作为临时方案。
内容来源于stack exchange
相关产品推荐
相关产品推荐

