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
相关产品推荐
相关产品推荐

