title | date | hideComments |
---|---|---|
第十二题:Parameters |
2020/05/29 |
false |
实现内置的 Parameters 类型,而不是直接使用它,可参考TypeScript 官方文档。
例如:
const foo = (arg1: string, arg2: number): void => {};
type FunctionParamsType = MyParameters<typeof foo>; // [arg1: string, arg2: number]
::: info 提示 在这个挑战中,你需要修改下方的代码使得测试通过(使其没有类型错误)。并且记得将答案分享奥。 :::
这个挑战要求我们从函数中获取部分信息。更确切地说,是函数的参数。我们首先声明一个 接受泛型类型 T 的类型,我们将使用它来获取参数:
type MyParameters<T> = any;
那么,“获得我们还不知道的类型”的正确方法是什么? 通过使用推断! 但在使用它之前,让 我们先从一个简单的条件类型来匹配函数:
type MyParameters<T> = T extends (...args: any[]) => any ? never : never;
这里,我们检查类型 T 是否与函数的任何参数和任何返回类型匹配。现在,我们可以利 用推断替换掉参数列表中的 any[]:
type MyParameters<T> = T extends (...args: infer P) => any ? never : never;
这样,TypeScript 编译器就会推断出函数的参数列表,并将其赋值给类型 P。剩下的就 是从分支返回类型:
type MyParameters<T> = T extends (...args: infer P) => any ? P : never;