重载函数的参数泛型不包含所有选项



给定一个重载函数example.

function example(a: string): number
function example(a: string, b?: string): number { 
return 1
}
type Result = Parameters<typeof example>

我希望 Result 包含example参数的所有选项,而不仅仅是第一个/最顶层的参数集。如何获取参数?

在问题的答案中,这重复了@ford04在这里的回答中提到的限制,即infer只查看最后一个重载的签名,得到了承认。 这是 TypeScript 缺少的功能或设计限制;有关相关功能请求,请参阅 Microsoft/TypeScript#29732。

但是这个答案表明这并非完全不可能;你可以梳理出一些关于重载的信息,至少对于最多具有任意固定数量的函数(从TypeScript 4.8开始仍然如此;递归条件类型没有帮助(。 但它又毛又丑,里面可能有错误,请参阅 microsoft/TypeScript#28867。 这是一种方法:

type Overloads<T> =
T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4
} ? [
(...args: A1) => R1,
(...args: A2) => R2,
(...args: A3) => R3,
(...args: A4) => R4
] : T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3
} ? [
(...args: A1) => R1,
(...args: A2) => R2,
(...args: A3) => R3
] : T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2
} ? [
(...args: A1) => R1,
(...args: A2) => R2
] : T extends {
(...args: infer A1): infer R1
} ? [
(...args: A1) => R1
] : any
type OverloadedParameters<T> =
Overloads<T> extends infer O ?
{ [K in keyof O]: Parameters<Extract<O[K], (...args: any) => any>> } : never
type OverloadedReturnType<T> =
Overloads<T> extends infer O ?
{ [K in keyof O]: ReturnType<Extract<O[K], (...args: any) => any>> } : never

Overloads<T>类型别名采用函数类型T并返回其调用签名的元组(最多四个重载(。OverloadedParameters<T>OverloadedReturnType<T>分别映射该元组上的Parameters<T>ReturnType<T>

让我们看看它的实际效果(在更正您的示例后,使其实际上具有多个重载,如另一个答案所示(:

function example(a: string): number
function example(a: string, b: string): number
function example(a: string, b?: string): number {
return 1
}
type ExampleOverloads = Overloads<typeof example>
// type ExampleOverloads = [(a: string) => number, (a: string, b: string) => number]
type ExampleParameters = OverloadedParameters<typeof example>
// type ExampleParameters = [[string], [string, string]]

在我看来很合理。 好的,希望有帮助;祝你好运!

链接到代码

最新更新