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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 06:22:34