[英]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.