如何为TypeScript泛型函数绑定参数同时指定泛型类型
解决方案
报错原因
TS7019:剩余参数args没有显式声明类型,TypeScript 默认推断为any[],严格模式下会触发隐式any报错TS2556:any[]类型不符合retrieve函数的入参要求,TypeScript 无法确认参数数量、类型与原函数匹配
方案1:直接提取参数类型(单次使用场景)
用TypeScript内置的Parameters工具类型结合条件类型推断,自动提取retrieve函数除第一个参数外的剩余参数类型,无需手动编写参数定义:
type User = { username: string; /* 其他用户字段 */ }; // 自动提取retrieve除第一个endpoint参数外的所有入参类型 type RetrieveParamsWithoutEndpoint = Parameters<typeof retrieve> extends [string, ...infer Rest] ? Rest : never; const retrieveUser = (...args: RetrieveParamsWithoutEndpoint) => retrieve<User>("/user", ...args);
后续retrieve的入参规则修改时,retrieveUser的参数类型会自动同步更新,无需手动维护。
方案2:高阶工厂函数(多接口复用场景)
如果需要创建多个不同endpoint的请求方法,可以封装通用的创建函数,一次性解决类型推断问题,复用性更高:
// 通用retriever创建工厂 function createRetriever<T>(endpoint: string) { type RestParams = Parameters<typeof retrieve> extends [string, ...infer Rest] ? Rest : never; return (...args: RestParams) => retrieve<T>(endpoint, ...args); } // 新增接口时仅需一行代码就能生成类型安全的请求方法 type User = { username: string }; const retrieveUser = createRetriever<User>("/user"); type Article = { id: string; title: string }; const retrieveArticle = createRetriever<Article>("/article");
内容的提问来源于stack exchange,提问作者malobre
相关产品推荐
相关产品推荐

