问题 #
实现内置的 Parameters<T>
类型,而不是直接使用它,可参考TypeScript官方文档。
declare function f1(arg: { a: number; b: string }): void
type T0 = myParameters<() => string> // []
type T1 = myParameters<(s: string) => void>// [s: string]
type T2 = myParameters<<T>(arg: T) => T>// [arg: unknown]
type T3 = myParameters<typeof f1>// [arg: { a: number; b: string; }]
type T4 = myParameters<any>// unknown[]
type T5 = myParameters<never> // never
type T6 = myParameters<string>// never
type T7 = myParameters<Function>// never
解答 #
type myParameters<T extends (...args: any) => any> = T extends (...args: infer U) => any ? U : never
拆分 #
- 首先
T
得满足是个函数所以得限制(...args: any) => any
参数和返回值可以是任意值 - 然后用
infer U
去占用函数参数的类型,如果有那就返回如果没有就返回never