如何在TypeScript中定义关联函数与对应参数的数组类型?
解决TypeScript函数名与参数的关联约束问题
问题根源
你之前的代码里,allCallBack被手动指定为Record<string, AnyCallback>,这直接让TypeScript丢失了每个函数的具体类型信息——它只知道这个对象的键是任意字符串,值是任意回调函数,所以后续的TaskType变成了string,args也变成了any[],自然没法把函数名和对应参数绑定起来。
解决步骤
1. 保留函数的具体类型信息
先修改allCallBack的定义,去掉手动指定的类型,让TypeScript自动推导每个函数的类型:
type AnyCallback = (...args: any) => unknown; const callbackAlpha = (data: string) => { console.log(data); return data.length; }; const callbackBeta = (data: string, prefix: string) => { console.log(data, prefix); return prefix + data; }; const callbackGamma = (data: string, prefix: string, suffix: string) => { console.log(data, prefix, suffix); return prefix + data + suffix; }; // 去掉手动指定的Record<string, AnyCallback>,让TS自动推导类型 const allCallBack = { callbackAlpha, callbackBeta, callbackGamma, };
2. 创建关联约束的联合类型
用映射类型遍历allCallBack的所有键,为每个键生成对应的{name: 键名, args: 对应函数的参数数组}类型,再把映射类型转为联合类型:
// 遍历allCallBack的每个键,生成对应的类型 type TaskItem<K extends keyof typeof allCallBack> = { name: K; args: Parameters<typeof allCallBack[K]>; }; // 将映射类型转为联合类型,最终数组类型 type TaskQueue = TaskItem<keyof typeof allCallBack>[];
或者可以用更简洁的写法,直接通过映射类型转联合:
type TaskQueue = { [K in keyof typeof allCallBack]: { name: K; args: Parameters<typeof allCallBack[K]>; } }[keyof typeof allCallBack][];
验证效果
现在TaskQueue数组里的每个元素都会严格绑定函数名和参数:
// 正确示例 const validTasks: TaskQueue = [ { name: 'callbackAlpha', args: ['test'] }, { name: 'callbackBeta', args: ['test', 'pre-'] }, { name: 'callbackGamma', args: ['test', 'pre-', '-suf'] } ]; // 错误示例(会被TS报错) const invalidTasks: TaskQueue = [ // 错误:callbackAlpha只需要一个参数 { name: 'callbackAlpha', args: ['test', 'extra'] }, // 错误:callbackBeta参数数量不对 { name: 'callbackBeta', args: ['test'] }, // 错误:参数类型不匹配 { name: 'callbackGamma', args: [123, 'pre-', '-suf'] } ];
这样就实现了函数名和对应参数的强关联约束,再也不会出现名字和参数不匹配的情况。
内容的提问来源于stack exchange,提问作者Sword fish
相关产品推荐
相关产品推荐

