TypeScript 根据函数参数之一的值推断函数的返回类型

问题描述 投票:0回答:1

我需要根据函数参数之一的值来更改函数的返回类型。

参数的类型为

Command
,定义如下。目标是使其可扩展,以便可以添加更多命令。

type Command = 'trueOrFalse' | 'logSomething';

有一个函数

handleCommand(command: Command) => ???
,其返回类型将根据命令而改变。不过我希望它能够推断返回类型,所以就像当你调用
handleCommand('trueOrFalse')
时,它知道它将返回
boolean

我有这个:

type Command = 'trueOrFalse' | 'logSomething'

type CommandHandler = {
    'toggleEnvironmentMap': () => boolean;
    'logSomething': () => void;
}

type Handlers = {
    [Key in Command]: () => ReturnType<CommandHandler[K]>;
}

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) {
        //error
    }

    return handler();
}

但是,当我调用此函数时,无论我传递

'trueOrFalse'
还是
'logSomething'
,返回类型都是
boolean | void
。是否可以让函数意识到当
'trueOrFalse'
是参数时,它应该是
boolean
返回类型?

我添加了很多这样的内容来解决函数中的类型错误,例如

Handlers
类型和
handler
常量的转换。现在函数本身没有类型错误,但返回类型不是我想要的。

编辑:

好吧,事实证明这个问题与调用

handleEvent
的中间函数有关。

这是中介功能。

triggerCommand(command: Command) {
    return this.commandDispatcher.handleCommand(command);
}

这就是导致类型错误的原因

let bool: boolean;
bool = triggerCommand('trueOrFalse'); // boolean | void cannot be assigned to boolean

谢谢你。要解决此问题,必须明确声明

triggerCommand

的返回类型
triggerCommand(command: Command): ReturnType<CommandHandler[T]>

抱歉,我没有提供此上下文,没有考虑此中介功能,因为它不执行任何操作。明白为什么它不起作用。

typescript
1个回答
0
投票

您只需将

triggerCommand
也设为通用即可。

function triggerCommand<T extends Command>(command: T): ReturnType<CommandHandler[T]> {
    return handleCommand(command);
}

let bool: boolean;
bool = triggerCommand('trueOrFalse'); // fine

看游乐场

© www.soinside.com 2019 - 2024. All rights reserved.