Skip to content

Latest commit

 

History

History
67 lines (45 loc) · 2.78 KB

1.12.parameters.md

File metadata and controls

67 lines (45 loc) · 2.78 KB
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]

点击github查看:

挑战

::: 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;

参考