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] };
报错原因解释
- 泛型上下文的约束限制:使用泛型
T extends Test时,TypeScript编译器只能将Omit<T, "data">的键类型推断为Exclude<keyof T, "data">,但它无法在泛型层面确认"where"一定属于这个集合——尽管逻辑上T继承Test必然包含"where",但编译器的约束检查仅基于类型定义的字面推导,而非逻辑推断。 - 具体类型的明确性:直接使用
Test时,Omit<Test, "data">的键类型是明确的"where",此时Pick的第二个参数"where"完全匹配约束,因此不会报错。
内容的提问来源于stack exchange,提问作者Val
相关产品推荐
相关产品推荐

