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

TypeScript中T extends Test泛型报错,直接用Test正常的问题求助

TypeScript类型重构报错问题解决与原因分析

报错代码示例

interface Test {
    data: string;
    where: string;
}

type TTA<T extends Test> = Pick<Omit<T, "data">, "where">;

报错信息:Type '"where"' does not satisfy the constraint '"data" | Exclude<keyof T, "data">'.ts(2344)

而直接使用具体类型Test的写法可正常运行:

type TTB = Pick<Omit<Test, "data">, "where">;

解决方法

可以直接简化类型定义,因为Omit<T, "data">后选取"where",等价于直接从T中提取"where"字段:

type TTA<T extends Test> = Pick<T, "where">;

如果需要明确体现排除data的语义(即使逻辑上where与data无关联),也可以用映射类型实现:

type TTA<T extends Test> = { [K in "where"]: T[K] };

报错原因解释

  1. 泛型上下文的约束限制:使用泛型T extends Test时,TypeScript编译器只能将Omit<T, "data">的键类型推断为Exclude<keyof T, "data">,但它无法在泛型层面确认"where"一定属于这个集合——尽管逻辑上T继承Test必然包含"where",但编译器的约束检查仅基于类型定义的字面推导,而非逻辑推断。
  2. 具体类型的明确性:直接使用Test时,Omit<Test, "data">的键类型是明确的"where",此时Pick的第二个参数"where"完全匹配约束,因此不会报错。

内容的提问来源于stack exchange,提问作者Val

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:19:57