= { [P in keyof T]?: T[P] };
```
> 刚才说了“由于是形参,因此起什么名字无所谓” 。因此这里就起了 T 而不是 Type,更短了。这也算是一种约定俗称的规范,大家一般习惯叫 T, U等表示泛型的形参。
我们来看下完整的泛型和函数有多像!

(定义)

(使用)
* 从外表看只不过是 `function` 变成了 `type`,`()` 变成了 `<>`而已。
* 从语法规则上来看, 函数内部对标的是 ES 标准。而泛型对应的是 TS 实现的一套标准。
简单来说,将类型看成值,然后对类型进行编程,这就是泛型的基本思想。泛型类似我们平时使用的函数,只不过其是作用在类型上,思想上和我们平时使用的函数并没有什么太多不同,泛型产生的具体类型也支持类型的操作。比如:
```
type ComponentType = ComponentClass
| FunctionComponent
;
```
有了上面的知识,我们通过几个例子来巩固一下。
```
function id(arg1: T, arg2: U): T {
return arg1;
}
```
上面定义了泛型 id,其入参分别是 T 和
U,和函数参数一样,使用逗号分隔。定义了形参就可以在函数体内使用形参了。如上我们在函数的参数列表和返回值中使用了形参 T 和 U。返回值也可以是复杂类型:
```
function ids(arg1: T, arg2: U): [T, U] {
return [arg1, arg2];
}
```

(泛型的形参)
和上面类似, 只不过返回值变成了数组而已。需要注意的是,思想上我们可以这样去理解。但是具体的实现过程会有一些细微差别,比如:
```
type P = [number, string, boolean];
type Q = Date;
type R = [Q, ...P]; // A rest element type must be an array type.
```
再比如:
```
type Lucifer = LeetCode;
type LeetCode = {
name: T;
};
const a: LeetCode; //ok
const a: Lucifer; // Type 'Lucifer' is not generic.
```
改成这样是 ok 的:
```
type Lucifer = LeetCode;
```
## 泛型为什么使用尖括号
为什么泛型要用尖括号(<>),而不是别的? 我猜是因为它和 () 长得最像,且在现在的 JS 中不会有语法歧义。但是,它和 JSX 不兼容!比如:
```
function Form() {
// ...
return (
评论已关闭