function request<T>(url: string, params: T) {}
const q = { page: 1, size: 20 } as const;
request<{ page: number; size: number }>('/list', q);
// 先显式传类型参数,确认是不是推导的锅
调用封装好的请求函数时实参看着没问题,编辑器却在那一行标红,提示 TS2345 Argument of type ‘X’ is not assignable to parameter of type ‘Y’,把对象拆开逐个传又能通过,类型提示也恢复正常。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,泛型参数出现在多个位置时,类型推断会从所有实参里挑一个最窄的结果,某处传了字面量或者联合类型,整体就被收窄,和形参声明的类型对不上。
「TS2345 泛型推导」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
处理上按这个顺序:先把实参单独赋给一个有明确类型的变量看还报不报错;给泛型显式写下类型参数 绕开自动推断这一段;必要时用 as const 固定字面量 别让它被扩宽。
改完只确认一件事:显式传类型参数后报错消失,再去掉 as const 复现一次,确认根因就在推导。
