如何在TypeScript泛型中让ReturnT可选并自动推断类型?
解决TypeScript泛型部分指定+自动推断问题
可行方案
方案1:用TS 4.7+的泛型占位符_
TypeScript 4.7及以上版本支持用_作为泛型参数的占位符,用来告诉编译器自动推断该参数的类型。这样你可以只指定第一个泛型ErrorT,第二个用_让TS自动从传入的函数推断ReturnT:
const wrap = <ErrorT, ReturnT>(func: () => ReturnT): ReturnT => { return func() } // 仅指定ErrorT,用_让TS自动推断ReturnT const result = wrap<Error, _>(() => 22) // result类型为number,符合预期
方案2:柯里化函数(兼容低版本TS)
如果需要支持TS 4.7以下版本,可以把函数拆成柯里化形式,先指定ErrorT,再传入函数让TS推断ReturnT:
const wrap = <ErrorT>() => <ReturnT>(func: () => ReturnT): ReturnT => { return func() } // 先指定ErrorT,再传入函数 const result = wrap<Error>()(() => 22) // result类型为number,符合预期
方案3:调整泛型参数顺序+默认值
把需要自动推断的ReturnT放在泛型参数第一位并设置默认值,需要手动指定的ErrorT放在后面,调用时用_占位ReturnT让TS自动推断:
const wrap = <ReturnT = never, ErrorT>(func: () => ReturnT): ReturnT => { return func() } // 用_让TS推断ReturnT,再指定ErrorT const result = wrap<_, Error>(() => 22) // result类型为number,符合预期
为什么之前的尝试无效?
你之前给ReturnT设置默认值(void/any/unknown)时,一旦显式指定ErrorT,TS会直接使用默认值作为ReturnT的类型,不会再去推断函数返回值——默认值会覆盖自动推断逻辑。而extends约束只是限制类型范围,同样无法解决部分指定泛型时的推断冲突问题。
内容的提问来源于stack exchange,提问作者Алексей Соснин
相关产品推荐
相关产品推荐

