TypeScript泛型自动推断与显式指定参数共存问题求解
问题根源
TypeScript 当前不支持泛型参数的部分推断:只要你手动指定了任意一个泛型参数,剩下未显式声明的泛型参数就不会再自动从入参推断,而是会 fallback 到对应泛型的约束默认值(无约束时为 unknown),因此你原来的写法中 A 泛型没有被正确识别,最终返回的类型只剩下手动指定的 Extra 类型。
解决方案
方案1:柯里化拆分泛型(适合仅需指定Extra类型、无需传入Extra运行时值的场景)
把需要手动指定的泛型和需要自动推断的泛型拆到两层函数中,即可实现单独指定 Extra 同时自动推断 A 的效果:
// 第一层仅接收需要手动指定的Extra泛型 function foo<Extra>() { // 第二层接收入参,自动推断A的类型 return function<A>(a: A): A & Extra { // 运行时逻辑根据实际需求实现,此处仅做类型示例 return a as A & Extra; } } const result = foo<{ b: number }>()({ a: 1 }); // 此时result类型为 { a: number } & { b: number },符合预期
方案2:把Extra作为入参传入(适合Extra有对应运行时值的场景)
如果你的 Extra 类型对应实际的运行时对象,直接把它作为函数入参传入即可,两个泛型都能自动推断,无需手动指定:
function foo<Extra, A>(extra: Extra, a: A): A & Extra { // 运行时合并两个对象,类型也会自动对应 return Object.assign({}, a, extra); } const result = foo({ b: 2 }, { a: 1 }); // result自动推断类型为 { a: number, b: number }
内容的提问来源于stack exchange,提问作者codeBaby
相关产品推荐
相关产品推荐

