TypeScript:如何根据动作名称推断对应参数的类型?
问题:根据动作名称推断schedule函数的params类型
首先定义如下API:
function changePot(args: {newSize: number, newSoil: string}){ } function water(args: { quantity: number, useIntrants: boolean}){ } const API = { changePot, water }
需求是实现一个schedule函数,接收一组植物操作数组,要求根据每个操作的action字段,自动推断params参数的类型,示例调用如下:
schedule([ {id: 'rose1', action: 'water', params: {quantity: 1, useIntrants: false}}, {id: 'baobab1', action: 'changePot', params: {newSize: 10, newSoil: 'mold'}}, {id: 'cactus1', action: 'changePot', params: {newSize: 3, newSoil: 'sand'}}, ])
用户尝试的代码无法实现需求,因为无法在对象类型内部关联action和params的类型:
function schedule(args: { id: string; action: keyof typeof API, // 此处无法直接引用当前元素的action params: Parameters<typeof API[action][0]> }[]){ }
解决方案
通过联合类型映射实现action与params的类型绑定:
// 生成每个动作对应的操作类型,并组成联合类型 type PlantOperation = { [K in keyof typeof API]: { id: string; action: K; params: Parameters<typeof API[K]>[0]; } }[keyof typeof API]; // 定义schedule函数 function schedule(args: PlantOperation[]){ // 示例实现:遍历执行每个操作 args.forEach(op => { API[op.action](op.params); }); }
原理说明
[K in keyof typeof API]遍历API的所有动作名称(changePot、water);- 对每个动作名称K,生成对应的操作类型:
action字段固定为K,params字段自动匹配该动作的参数类型(通过Parameters<typeof API[K]>[0]获取函数的第一个参数类型); [keyof typeof API]将所有生成的类型提取为联合类型,确保每个操作的action和params严格对应。
这样调用schedule时,TypeScript会自动校验每个操作的params是否与action匹配,比如action为water时,params必须包含quantity和useIntrants字段,类型不匹配或拼写错误都会触发编译报错。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

