我需要根据函数参数之一的值来更改函数的返回类型。
参数的类型为
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]>
抱歉,我没有提供此上下文,没有考虑此中介功能,因为它不执行任何操作。明白为什么它不起作用。
您只需将
triggerCommand
也设为通用即可。
function triggerCommand<T extends Command>(command: T): ReturnType<CommandHandler[T]> {
return handleCommand(command);
}
let bool: boolean;
bool = triggerCommand('trueOrFalse'); // fine