如何让TypeScript函数根据参数值自动推导返回类型?
动态根据命令参数推导函数返回类型的问题解决
问题场景
需要实现一个函数,根据传入的Command类型参数动态返回对应类型,同时支持后续新增命令的扩展。定义的命令类型如下:
type Command = 'trueOrFalse' | 'logSomething';
期望效果:调用handleCommand('trueOrFalse')时自动推断返回boolean类型,调用handleCommand('logSomething')时返回void类型。
最初实现的问题
按思路编写的代码如下,但实际调用时,不管传入哪个命令,返回类型都被推断为boolean | void,达不到预期的精准类型推断:
type Command = 'trueOrFalse' | 'logSomething' type CommandHandler = { 'trueOrFalse': () => boolean; 'logSomething': () => void; } // 注意:原代码里的K是笔误,修正为Key type Handlers = { [Key in Command]: () => ReturnType<CommandHandler[Key]>; } function handleCommand<T extends Command>(command: T): ReturnType<CommandHandler[T]> { const handlers: Handlers = { 'trueOrFalse': () => true, 'logSomething': () => { console.log('Test') } } const handler = handlers[command] as () => ReturnType<CommandHandler[T]>; if (!handler) { throw new Error('Unknown command'); } return handler(); }
问题根源
问题出在调用handleCommand的中间函数triggerCommand上,原实现没有保留命令参数和返回类型的泛型关联:
triggerCommand(command: Command) { return this.commandDispatcher.handleCommand(command); }
此时调用triggerCommand('trueOrFalse'),TypeScript无法把具体的命令值和对应的返回类型绑定,只能返回所有可能类型的联合boolean | void,导致给boolean类型变量赋值时触发类型错误。
解决方法
给triggerCommand添加泛型约束,显式关联命令参数和返回类型,让TypeScript能根据传入的具体命令值推导正确的返回类型:
triggerCommand<T extends Command>(command: T): ReturnType<CommandHandler[T]> { return this.commandDispatcher.handleCommand(command); }
修改后,调用triggerCommand('trueOrFalse')时返回类型会被正确推断为boolean,调用triggerCommand('logSomething')时返回void,既满足类型安全要求,也支持后续扩展——只需在Command和CommandHandler中新增命令及对应处理函数即可。
内容的提问来源于stack exchange,提问作者Kyle Hobbs
相关产品推荐
相关产品推荐

