You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

条件类型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:35:24