繁体   English   中英

合并包含函数的接口的返回类型

[英]Merge return types of interface containing functions

假设我们有一个包含一些函数的对象:

const handlers = {
  handler1: (state: State, payload: boolean) => ({
    schema: payload,
    errors: [],
  }),
  handler2: (state: State, payload: string[]) => ({
    errors: payload,
  }),
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  reset: (...args: any) => initialState,
}

我需要定义一个类型来合并它们的返回类型,比如

State | {
  schema: boolean,
  errors: never[]
} | {
  errors: string[]
}

一个简单的解决方案可能是

type MergeReturnTypes1 = ReturnType<typeof handlers[keyof typeof handlers]>

但是我不明白为什么下面的类型定义

type MergeReturnType2<H> = H extends Record<string, (...args: any) => infer T> ? T : never

仅返回handlers对象中包含的第一个函数的返回类型

type T = MergeReturnType2<typeof handlers>

T = {
  schema: boolean
  errors: never[]
}

老实说,我不确定为什么这不起作用,但我仍在试图找出解释。

您可以通过使用T来推断Record中的整个函数而不是仅推断返回类型来解决此问题。

type MergeReturnType2<H> = H extends Record<string, infer T extends (...args: any) => any> 
  ? ReturnType<T> 
  : never

type T = MergeReturnType2<typeof handlers>

// type T = State | {
//     schema: boolean;
//     errors: never[];
// } | {
//     errors: string[];
// }

操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM