【发布时间】:2022-11-04 06:55:26
【问题描述】:
我在弄清楚如何根据 Typescript 中的条目参数正确包装可能具有多种返回类型的函数时遇到了一些问题。
假设我想要一个函数,当给定VariantEnum .a 作为参数时,将返回ReturnA,而当给定VariantEnum.b 时,将返回ReturnB。
鉴于sampleFunction 的以下实现:
enum VariantEnum { a, b }
type ReturnA = string
type ReturnB = number
type VariantReturnMap<V> =
V extends VariantEnum.a ? ReturnA :
V extends VariantEnum.b ? ReturnB :
undefined
declare function sampleFunction<V extends VariantEnum>(variant: V): VariantReturnMap<V>
直接调用函数时有效:
sampleFunction(VariantEnum.a) // return type is ReturnA, as expected
但不是在使用包装器调用它时,除非我再次重新声明所有内容:
function wrapperFunction(variant: VariantEnum) {
// something else
return sampleFunction(variant) // return type is `(ReturnA | ReturnB)`, since we don't know which variant we have yet
}
wrapperFunction(VariantEnum.a) // return type is still `(ReturnA | ReturnB)`
sampleFunction(VariantEnum.a) // return type is still ReturnA, as expected
据我所知,TS 应该有足够的信息来推断给定包装器返回原始函数,它应该具有相同的返回类型。但是,它总是返回联合类型。
有没有其他方法可以让它推断出正确的类型,而不必再次声明它?
(同样的问题在用不同的方法重载函数时仍然会发生,例如ReturnA和ReturnB的单独声明)
【问题讨论】:
标签: typescript