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

TypeScript如何用泛型将配置对象映射为方法返回值组成的新对象

问题原因
  • 你的mapProgramConfig泛型写死了取通用programOption的validator返回值,始终返回unknown类型,没有关联到泛型T每个键对应的实际validator类型
  • Program类没有声明泛型参数,构造函数传入的programConfig用了默认的空对象泛型参数,无法自动推导你传入的options结构
修正后的完整代码
type ProgramOption = {
  validator: () => unknown
}

// 映射类型:取每个key对应validator的返回值类型
type MapProgramConfig<T extends Record<string, ProgramOption>> = {
  [K in keyof T]: ReturnType<T[K]['validator']>
}

type ProgramConfig<T extends Record<string, ProgramOption> = {}> = {
  options: T,
  handler: (data: MapProgramConfig<T>) => void,
}

// Program类声明泛型,让构造函数可以自动推导传入的config类型
class Program<T extends Record<string, ProgramOption>> {
  constructor (config: ProgramConfig<T>) {}
}

const foo = new Program({
  options: {
    'fruit': { validator: () => 'asdf' },
    'animal': { validator: () => 42 },
  },
  handler: ({fruit, animal}) => {
    // 此时fruit自动推导为string,animal自动推导为number
    // 注意:这里如果写不存在的key比如thing,TS会正常报错,属于符合预期的类型校验
  },
});
关键改动说明
  • 调整MapProgramConfig的取值逻辑:将ReturnType<programOption['validator']>改为ReturnType<T[K]['validator']>,动态获取每个配置项对应validator的返回值类型,而不是统一用基础类型的unknown
  • 给Program类增加泛型参数T,构造函数绑定ProgramConfig<T>类型,TS会根据你传入的options结构自动推导泛型T的实际类型,进而正确推导handler的入参类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:54:07