条件类型extends块中推断类型嵌套extends在d.ts编译报错
问题:.d.ts文件中infer带约束语法触发TS1005错误
问题详情
在.d.ts文件中使用以下简化代码时,tsc编译失败,在标记位置抛出错误:error TS1005: '?' expected.
declare type BaseTest<B extends C> = ...; export declare type Test<T extends A> = T extends (infer B extends C)[] ? BaseTest<B> : never; ~
但这段.d.ts代码是由某库的源码(如下简化版)通过tsc无报错生成的:
type BaseTest<B extends C> = ...; export type Test<T extends A> = T extends (infer B extends C)[] ? BaseTest<B> : never;
此处的extends约束不可省略——B需要作为泛型参数传入BaseTest,而BaseTest要求其泛型参数必须继承C。
原因分析
infer B extends C这种带约束的类型推断语法是TypeScript 4.7及以上版本才新增的特性。问题根源在于:
- 库的源码使用高版本TS编译,生成的
.d.ts保留了该语法; - 你的项目使用的TS版本低于4.7,无法识别该语法,因此编译
.d.ts时触发报错; - 即使编译选项(target、module等)一致,TS版本不兼容仍会导致这个问题。
解决方案
方案1:升级项目TS版本
将项目的TypeScript依赖升级到4.7或更高版本,直接支持infer B extends C语法,编译.d.ts时即可正常通过。
方案2:修改.d.ts兼容低版本TS
如果无法升级TS版本,可以将带约束的推断拆分为两层条件判断,兼容低版本语法:
declare type BaseTest<B extends C> = ...; export declare type Test<T extends A> = T extends (infer B)[] ? B extends C ? BaseTest<B> : never : never;
先推断出B,再额外校验B extends C,既保留了约束逻辑,又能让低版本TS识别。
方案3:检查库的编译配置
确认库在生成.d.ts时使用的TS版本为4.7+,同时确保tsconfig.json中declaration选项已开启,避免生成不兼容低版本的.d.ts内容。
内容的提问来源于stack exchange,提问作者Philip Damianik
相关产品推荐
相关产品推荐

