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

TypeScript 如何根据对象参数的transform回调返回值推断函数返回类型

问题原因

  1. HttpCallInitOf<T>中定义的transform为方法级泛型,每次调用的泛型作用域独立,无法在调用post方法时提前推断出实际的返回类型,需要将transform的返回类型泛型提升到HttpCallInitOf的参数列表层级。
  2. 原post方法的返回值条件类型判断逻辑不准确,没有正确匹配可选transform属性的类型结构,导致推断失效。

修正后的完整代码

type DefaultHttpCallInit = {  
  throttle?: number;
  baseUrl?: string;
  url?: string;
  onSend?(e: HttpCallInit) : void | Promise<void>;
}

export type HttpCallInit = RequestInit & DefaultHttpCallInit 

// 把transform的返回类型泛型提到类型层级,移除方法内部泛型定义
export type HttpCallInitOf<T, TOut = T> = RequestInit & DefaultHttpCallInit & {
  transform?: (v: T) => TOut
};

export type HttpCallerInstance = {  
  // 新增TOut泛型,默认值等于T,直接关联init参数的类型定义
  post<T, TOut = T>(data?: T, init?: HttpCallInitOf<T, TOut>): Promise<TOut>;
}

// 测试代码保持不变
let r = {} as HttpCallerInstance;

interface Post {
    id?: number;
    title: string;
}

interface User {
  id: number;
  userName: string;
}

interface UserPost extends Post{
  user: User
}

const user = {/* info props */} as User;

// 此时返回值自动推断为Promise<UserPost>
const res = r.post({title: 'New post'} as Post, {
  transform(post) { 
    return Object.assign(post, {user}) as UserPost
  }
})

效果验证

  • 不传transform参数时,TOut默认等于第一个泛型T,返回值为Promise<T>,符合默认使用第一个泛型的需求。
  • 传入transform参数时,TS会自动根据transform的返回值推断TOut的类型,无需手动指定泛型,返回值自动匹配transform的返回类型的Promise包装。

内容的提问来源于stack exchange,提问作者Pedro Mora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:45:01