TypeScript多泛型部分指定类型时如何保留剩余泛型的自动推断
问题原因
TypeScript 泛型目前遵循全量推断或全量手动指定的设计规则:只要你手动指定了任意一个泛型参数,剩余未指定的泛型就会直接使用定义时的默认类型,不会再基于入参做自动推断。
解决方案
方案1:柯里化拆分泛型层级(全版本兼容)
最通用的兼容方案是把需要手动指定的泛型和需要自动推断的泛型拆分到不同的函数调用层:
// 第一层只放需要手动指定的泛型参数 function fun<A = any>() { // 第二层放需要根据入参自动推断的泛型参数 return function<B = any>(a: A, b: B) { return [a, b] as const; } }
使用时先指定需要手动设置的泛型,第二层调用不需要传泛型,会自动基于入参推断类型:
let a: number; let b: string; // 第一层指定第一个泛型为number,第二个泛型由第二层入参自动推断 const res = fun<number>()(a, b); // res的类型自动推断为 readonly [number, string]
方案2:显式推断占位符(TS 5.2+ 支持)
如果你使用的 TypeScript 版本 >= 5.2,可以直接在泛型参数位写infer标记该位置走自动推断,无需修改原函数定义:
let a: number; let b: string; // infer 标记第二个泛型走自动推断 const res = fun<number, infer>(a, b); // 自动推断返回值类型为 [number, string]
内容的提问来源于stack exchange,提问作者8pattern
相关产品推荐
相关产品推荐

