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

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);
    });
}

原理说明

  1. [K in keyof typeof API]遍历API的所有动作名称(changePot、water);
  2. 对每个动作名称K,生成对应的操作类型:action字段固定为K,params字段自动匹配该动作的参数类型(通过Parameters<typeof API[K]>[0]获取函数的第一个参数类型);
  3. [keyof typeof API]将所有生成的类型提取为联合类型,确保每个操作的action和params严格对应。

这样调用schedule时,TypeScript会自动校验每个操作的params是否与action匹配,比如action为water时,params必须包含quantity和useIntrants字段,类型不匹配或拼写错误都会触发编译报错。

内容的提问来源于stack exchange,提问作者Leo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:52:06