题目
实现内置的 Parameters 类型,而不是直接使用它,可参考TypeScript官方文档。
例如:
const foo = (arg1: string, arg2: number): void => {}
const bar = (arg1: boolean, arg2: { a: 'A' }): void => {}
const baz = (): void => {}
// 返回函数形参的类型: [arg1: string, arg2: number]
type t1 = MyParameters<typeof foo>
// 返回类型: [boolean, { a: 'A' }]
type t2 = MyParameters<typeof bar>
// 返回类型: []
type t3 = MyParameters<typeof baz>
原题链接
思路
这道题的关键在于 T 这个函数接收的实参类型,它只有在用户传入的时候才能知道。
这种情况,我们就要用 infer 关键字推断出一个 X 类型。
infer 会在用户传入参数的时候解析出实参类型,并将实参类型赋值给 X,所以,我们可以通过 X 来代表用户传入的实参类型。
type MyParameters<T extends (...args: any[]) => any> =
// 通过 infer 解析出用户传入的函数的实参类型,并赋值给 X
T extends (...args: infer X) => any
?
// 返回 X,即是实参的类型
X
:
// 返回啥都行,因为 T 已经被约束成函数类型,不可能走到这条分支。
never;
实现
综上所述,最终的类型工具 MyParameters 实现为:
type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer X) => any ? X : never;