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

如何在TypeScript中为PluginParams实现动作与参数的映射类型?

TypeScript:实现动作名称与对应参数的类型映射

你的核心问题是PluginParams类型没有建立action和data的关联,导致所有动作的参数被合并成交叉类型,无法实现动作与参数的一一对应。以下是解决方案:

核心思路

通过映射类型+联合类型,为每个动作名称生成独立的类型结构,让TypeScript能根据action的值自动约束data的类型。

完整修正代码

export class Plugin {
    actions = {
        'join': ({ groupId }: { groupId: string }) => {},
        'addPoint': ({ point }: { point: number }) => {}
    } as const; // 可选:锁定动作名称和参数的精确类型,避免类型拓宽
}

// 重新定义PluginParams类型,建立动作与参数的映射
export type PluginParams<T> = {
    [K in keyof T['actions']]: {
        action: K;
        data: Parameters<T['actions'][K]>[0];
    }
}[keyof T['actions']];

function callPlugin<T>(v: PluginParams<T>) {
    console.log(v);
}

// 正确调用:action为addPoint时,data仅需传入point
callPlugin<Plugin>({
    action: 'addPoint',
    data: {
        point: 100
    }
});

// 正确调用:action为join时,data仅需传入groupId
callPlugin<Plugin>({
    action: 'join',
    data: {
        groupId: 'group-001'
    }
});

// 错误示例:TypeScript会自动校验参数不匹配的情况
callPlugin<Plugin>({
    action: 'addPoint',
    data: {
        groupId: 'group-001' // 类型错误,符合预期
    }
});

关键代码解释

  1. Parameters<T['actions'][K]>[0]:使用TypeScript内置工具类型Parameters,提取对应动作函数的参数数组,取第一个元素(即动作函数接收的参数对象类型)。
  2. 映射转联合类型:[keyof T['actions']]将遍历动作名称生成的对象类型,转换为联合类型。这样TypeScript会根据action的具体值,自动匹配对应的data类型。
  3. as const的作用:可选但推荐,它会锁定actions对象的键和值的精确类型,避免动作名称被拓宽为string,让类型检查更严格。

内容的提问来源于stack exchange,提问作者Mr.Trieu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 19:55:01