Tsconfig paths通配符问题:为何双通配符配置不生效?
问题原因解析
首先得明确:TypeScript的paths配置和include字段用的是完全不同的通配符规则,这就是你遇到差异的核心原因。
1. paths配置的通配符规则
paths是用来映射模块导入路径的,它的语法规则和文件系统的glob模式不一样:
- 键名里只能用单个
*作为通配符,这个*代表的是@src/之后的整个路径片段(比如你导入的@src/types/type里,*就对应types/type)。 - 映射目标里的
*会被替换成键名中*匹配到的内容。
你的初始配置为什么失败
你一开始写的:
"paths": { "@src/*": ["./src/**/*"] }
当你导入@src/types/type时,TypeScript会把*替换成types/type,最终映射成./src/**/types/type——这显然不是正确的文件路径,自然找不到模块。
改成单通配符目标后:
"paths": { "@src/*": ["./src/*"] }
映射结果变成./src/types/type,刚好对应实际文件路径,所以问题解决。
为什么@src/**/*作为键无效
paths的键名不支持**通配符,它的设计是用来匹配模块前缀的,比如@src/*匹配所有以@src/开头的导入路径,而**是glob模式里的递归匹配符号,在paths的键里没有意义,TypeScript无法识别这种模式,所以配置无效。
2. include字段的通配符规则
include是用来指定TypeScript需要编译的文件范围,它用的是标准的glob文件匹配模式:
**代表递归匹配所有子目录,所以src/**/*能正确匹配src下所有层级的文件,这和paths的规则完全无关。
总结一下:paths是模块路径映射工具,只支持单个*做前缀匹配;include是文件范围匹配,支持完整的glob规则,两者的通配符逻辑不一样,所以会出现你遇到的差异。
内容的提问来源于stack exchange,提问作者soda_pharl
相关产品推荐
相关产品推荐

