如何在TypeScript泛型条件类型中实现exec函数change参数的类型推断?
解决TypeScript中Edit参数的联动类型推断问题
问题核心在于原有的Edit<T>泛型接口无法让param和change的类型形成绑定关系:当T传入联合类型keyof Task时,生成的类型会让param和change各自成为独立的联合类型,导致TypeScript无法根据param的值自动约束change的类型。
解决方案:将Edit定义为绑定参数的联合类型
把原来的泛型接口替换为映射类型生成的联合类型,让每个param对应的change类型严格绑定:
type Priority = "HIGH" | "MED" | "LOW"; type Task = { title: string; desc: string; priority: Priority; } // 替换原有的Edit<T>接口,生成param与change绑定的联合类型 type Edit = { [K in keyof Task]: { param: K; change: Task[K]; } }[keyof Task]; // 调整ParamsType的edit分支,直接使用新的Edit类型 export type ParamsType<T> = T extends "add" ? Add : T extends "help" ? Help : T extends "edit" ? Edit : never; // 保持exec函数的定义不变 exec<T extends Params>(command: T, args: ParamsType<T>) { switch (command) { case "add": // call add break; case "edit": // call edit break; } }
效果验证
现在调用schedule.exec("edit", {param: "priority", change: "notintype"})时,TypeScript会立即报错,因为change必须是Priority类型(即"HIGH" | "MED" | "LOW")。而当你传入param: "title"时,change会自动被约束为string类型,完全实现了根据param值自动推断change类型的需求。
原理说明
通过映射类型{ [K in keyof Task]: ... },我们为Task的每个键生成了一个独立的对象类型,其中param固定为当前键K,change固定为Task[K]对应的类型。最后通过[keyof Task]将这个映射类型转换为联合类型,使得TypeScript能够识别每个分支中param和change的绑定关系,从而实现精准的类型推断。
内容的提问来源于stack exchange,提问作者danielvolchek
相关产品推荐
相关产品推荐

