如何推断函数参数的类型?

How to infer type for arguments for function?

我有一个这样的类型声明来排除 return 联合类型:

export type ExcludeReturnType<T extends (...args: any[]) => any, R> = (...args: any) => Exclude<ReturnType<T>, R>

type Orig = (a: number) => string | void
type Result = ExcludeReturnType<Orig, void> // (...args: any[]) => string
type Expected = (a: number) => string

但是现在它只会将所有参数变成any[]。如何保留原始函数的类型?

Playground

使用 Parameters 实用程序类型:

export type ExcludeReturnType<T extends (...args: any[]) => any, R> = 
  (...args: Parameters<T>) => Exclude<ReturnType<T>, R>
type Orig = (a: number, b: string) => string | void
type Result = ExcludeReturnType<Orig, void> 
// type Result = (a: number, b: string) => string

Playground