最近上手TS,泛型是我一直迷糊的点,官网泛型的部分反反复复看了好几遍,讲解泛型的文章也看了不少,好像是懂了,又好像不懂。
如果问我泛型是什么,嗯,支持多类型数据?传入类型影响输出类型?理解成更严格的any?带<>?如果你的回答和我一样,恭喜你,你已经达到了你以为你懂,实战就蒙的境界~(不信,去找个开源TS项目的源码看看。)
今天终于搞明白泛型了,写一个笔记,文章有点长,如果你也是TS小白,强烈建议看一下,因为我也是小白,我懂你~如果你是大佬,点关闭~哈哈哈哈哈
一、值和类型 *
泛型是一种抽象类型,string,number,boolean等是一种具体类型,具体类型我们多是对值进行编程,泛型是对类型进行编程。
这句话听起来抽象,但是最终我明白了泛型,也是因为这句话。
1、对值编程
- TS中我们常用的就是对值限定类型。从集合论的角度上来说, 值的集合就是类型。
- 下面的例子,可以看出是对具体的值 ‘lianlian’ 进行编程,字符串 ‘lianlian’ 就是 string 类型的一个具体的值 。所以,这就是我们常用的对值限定类型,对值进行的编程。
function sayName(name: string) {
console.log(`my name is ${
name}`)
}
sayName('lianlian')
二、泛型
上面说了很多,我们了解了类型和值的区别。也了解了我们平时使用的简单类型,本质上都是对值进行编程,只是在编程之前,对将值限定了类型~
1、为什么需要泛型
想实现一个identity函数,这个函数会返回任何传入它的值(肯定传入和返回的类型也是相同)。(官网上你一定看过这个函数例子~)。
可以使用any这样写,但是这样写会丢失一些信息:传入的类型和返回的类型要求是相同的。如果我们传入一个’lianlian’,只知道任何类型的值都有可能被返回。
function identity(arg