如何基于泛型函数类型定义泛型实例箭头函数?
如何定义可复用的泛型函数签名类型并正确实现
需求与可行示例
需要定义一个可复用的泛型函数签名类型,用于统一多个函数的结构,该类型通过泛型参数将函数返回结果转换为指定类型。以下是直接实现单个泛型函数的可行示例:
async function callEndpoint1<ReturnT>(url: string, init?: RequestInit): Promise<ReturnT> { // 假设此处是HTTP请求返回的JSON字符串 return JSON.parse("{}") as ReturnT; } async function callEndpoint2<ReturnT>(url: string, init?: RequestInit): Promise<ReturnT> { // 假设此处是HTTP请求返回的JSON字符串 return JSON.parse("{}") as ReturnT; } const x1 = callEndpoint1<{prop:string}>("a-url"); const x2 = callEndpoint2<{prop:string}>("a-url");
遇到的问题
尝试将函数签名提取为可复用类型时,出现ReturnT未定义的错误:
type CallEndpointFunction = <ReturnT>(url: string, init?: RequestInit) => Promise<ReturnT>; const callEndpoint3: CallEndpointFunction = async (url, init) => { return JSON.parse("{}") as ReturnT; // 错误:Cannot find name 'ReturnT'. } const x3 = callEndpoint3<{ prop: string }>("a-url");
解决方案
错误原因是:CallEndpointFunction是一个泛型函数类型,但在实现函数时,你没有在函数本身声明泛型参数,导致函数内部无法访问类型层面的ReturnT。正确的实现方式是让函数本身也成为泛型函数:
type CallEndpointFunction = <ReturnT>(url: string, init?: RequestInit) => Promise<ReturnT>; const callEndpoint3: CallEndpointFunction = async <ReturnT>(url, init) => { return JSON.parse("{}") as ReturnT; } const x3 = callEndpoint3<{ prop: string }>("a-url");
这样函数实现时声明的ReturnT会和类型定义中的泛型参数关联,内部就能正常访问该泛型参数了。
补充说明
尽管上述方案可以解决类型定义问题,但正如你提到的,仅通过泛型参数盲目转换函数结果并非最佳实践——这种方式会绕过TypeScript的类型检查,可能导致实际返回值与声明类型不匹配,引发运行时错误。更安全的做法是根据API的实际返回结构定义具体类型,或使用类型守卫来验证返回值的类型合法性。
内容的提问来源于stack exchange,提问作者mehran
相关产品推荐
相关产品推荐

