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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:10:25