TypeScript 如何根据对象参数的transform回调返回值推断函数返回类型
问题原因
HttpCallInitOf<T>中定义的transform为方法级泛型,每次调用的泛型作用域独立,无法在调用post方法时提前推断出实际的返回类型,需要将transform的返回类型泛型提升到HttpCallInitOf的参数列表层级。- 原
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
相关产品推荐
相关产品推荐

