TypeScript中如何为const声明的重载函数添加泛型?
TypeScript 泛型重载的const函数实现方案
背景:const函数的重载实现
TypeScript支持函数重载,可通过接口实现const函数的重载,示例代码如下:
interface FetchOverload { (action: string, method: 'post' | 'get'): object; (action: string): object } const fetch: FetchOverload = (action: string, method: 'get' | 'post' = 'get'): object => { // 业务实现逻辑 }
若需指定固定返回类型,只需将object替换为目标类型(如UserResponse)即可。
泛型重载的困境
当希望函数返回泛型类型T时,无法直接为const声明的函数添加泛型T,尝试以下写法均无效:
<T> const fetch: ... const <T> fetch: ... const fetch <T>: ... const fetch: <T> FetchOverload<T> = ... const fetch: FetchOverload<T> = <T> (action: ...)
目前可行的替代方案是将const函数转为带重载的普通function:
function fetch<T>(action: string, method: 'post' | 'get'): T; function fetch<T>(action: string): T; function fetch<T>(action: string, method: 'post' | 'get' = 'get'): T { // 业务实现逻辑 }
结论
目前必须采用普通function的方式实现泛型重载,因为TypeScript暂不支持直接为const函数表达式声明泛型重载签名。
当然也可以通过给重载接口添加泛型参数,结合类型断言间接实现类似效果,但这种写法不够直观,且会丢失部分类型校验:
interface FetchOverload<T> { (action: string, method: 'post' | 'get'): T; (action: string): T } const fetch = ((action: string, method: 'get' | 'post' = 'get') => { // 业务实现逻辑 }) as FetchOverload<any>; // 调用时手动指定泛型 const user = fetch<UserResponse>('/api/user');
这种方式需要手动指定泛型,无法自动推导,类型安全性也不如普通function写法,因此更推荐使用标准的普通function泛型重载方案。
内容的提问来源于stack exchange,提问作者David Rodrigues
相关产品推荐
相关产品推荐

