You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于泛型函数类型定义泛型实例箭头函数?

如何定义可复用的泛型函数签名类型并正确实现

需求与可行示例

需要定义一个可复用的泛型函数签名类型,用于统一多个函数的结构,该类型通过泛型参数将函数返回结果转换为指定类型。以下是直接实现单个泛型函数的可行示例:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:47:46