typescript - 方法参数类型基于前一个参数的返回类型
我有以下方法(没有类型,因为这就是这个问题的重点):
export const mockSelector = (selector, matchers, returnValue) => {
// Implementation
}
在这种方法中,selector 是一个返回值的方法,而 returnValue 就是我想配置的模拟返回值。它的用法如下:mockSelector(timerStoppedAtForPlayerSelector, [player.id, timerType], null)。
我问题的核心是:我如何才能让 returnValue 的类型等于 selector 的返回类型?换句话说,如果我正在模拟的 selector 是 () => 'Hello',那么如果 returnValue 给出的不是 string 类型,TS 就会报错;如果 selector 是 () => 42,那么如果 returnValue 不是 number 类型,TS 就会报错。
我考虑过使用泛型来为参数类型化,但我遇到的问题是,每当 selector 的签名发生变化时,TS 不会提醒我。
我认为这是我达到的最接近的情况:
export const mockSelector = (selector: <T>(...args: any[]) => T, matchers: unknown[], returnValue: ReturnType<typeof selector>) => {
// Implementation
}
然而,使用它会导致此错误:TS2345 类型为 A 的参数不能赋值给类型为 A 的参数。
答案#1
你应该为此使用一个通用类型参数:
function mock<T>(selector: () => T, returnValue: T) {
}
这样你就将选择器函数的返回类型与 returnValue 参数“连接”起来了。
