如何在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' // 类型错误,符合预期 } });
关键代码解释
Parameters<T['actions'][K]>[0]:使用TypeScript内置工具类型Parameters,提取对应动作函数的参数数组,取第一个元素(即动作函数接收的参数对象类型)。- 映射转联合类型:
[keyof T['actions']]将遍历动作名称生成的对象类型,转换为联合类型。这样TypeScript会根据action的具体值,自动匹配对应的data类型。 as const的作用:可选但推荐,它会锁定actions对象的键和值的精确类型,避免动作名称被拓宽为string,让类型检查更严格。
内容的提问来源于stack exchange,提问作者Mr.Trieu
相关产品推荐
相关产品推荐

