请考虑:
const fcts = {
fctNumber: () => 1,
fctBoolean: () => true,
}
不出所料,简单地从fcts
中 Select 的函数将返回基于值T
的正确类型
const getFct = <T extends keyof typeof fcts>(name: T) => {
return fcts[name]
}
getFct('fctNumber') // () => number
getFct('fctBoolean') // () => boolean
同样的函数,但返回调用所选函数的result,期望返回所选函数的返回类型,但TS反而推断number | boolean
const getResult = <T extends keyof typeof fcts>(name: T) => {
const fct = fcts[name]
return fct()
}
getResult('fctNumber') // expected number, got number | boolean
getResult('fctBoolean') // expected boolean, got number | boolean
更改最后一行以添加看似多余的断言是可行的:
return fct() as ReturnType<typeof fct>
...但为什么呢?这似乎没有增加任何新的信息