Typescript 泛型理解之初识泛型
Typescript 是强类型语言,一般情况下每一个变量、返回值、参数都需要注解对应的数据类型,非对应数据类型不可操作。
泛型是什么?我们先看下百度百科怎么说的:
泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。
???????????????
好吧,百度百科好像看不懂,那我们就不管百度百科的解释了。
基本上每个编程语言都会含有泛型这个概念,今天主要记录下Typescript的泛型
理解。
我们直接理解泛型可能不好理解,我们不如先把这两个字拆开:泛、型。
我们先说“型”,这里的型就是类型的意思,即数据类型。
那再来说下“泛”,这个字不好理解,我们先从引文入手,“泛型”的英文是“generic paradigm”,这两个单词看一看作是“泛型”两个字,那“generic”就可以理解为“泛”,而“generic”是通用的意思。这样一来我们就明白了“泛型”的大致意思就是:通用的数据类型
。
好,我们已经明白了泛型了概念,那为啥要用泛型呢?这个百度百科有个可以理解的解释:其主要目的是加强类型安全及减少类转换的次数
。
我们首先要知道泛型是用来加在函数、类、接口上面的。
一、了解泛型
我们先来看下不加泛型的函数:
function identity(arg: number): number {
return arg;
}
上面这个函数的意思就传入一个number类型的参数,函数返回一个number类型的值。下面看下加了泛型的函数:
function identity<T>(arg: T): T{
return arg;
}
上面的<T>
就是泛型的意思,函数意思是传入一个T类型的参数,函数返回一个T类型的值。我们知道数据类型中并没有T类型,所以这里的T就是泛型,代表通用的数据类型。这样在执行这个函数的时候可以定义参数的类型,也可以不定义让系统自动识别参数类型,并返回识别的类型的值。
let output = identity<number>(3); // 定义泛型的类型为number类型
let output = identity(3); // 未定义泛型类型,系统自动识别为number类型
可以看出加了泛型的函数更灵活些,再调用的时候才固定参数类型,当然,也可以使用上面加了泛型的函数传一个字符串,
let output = identity<string>('seebin'); // 定义泛型的类型为number类型
let output = identity('seebin'); // 未定义泛型类型,系统自动识别为number类型
当然,上面T是自己定义的,也可以用M、N等其它变量,不过人们默认为T。
二、泛型函数数组参数
上面的泛型例子只是用来了解什么是泛型,不过毕竟例子台简单,代替不了所有的泛型应用,比如我们在要函数里面处理一些逻辑,拿官方例子来说:
function identity<T>(arg: T): T{
console.log(arg.length);
return arg;
}
这个时候如果传入数字类型,就报错了,因为数字没有length属性。或者换种说法,我们想往identity函数里面传入一个数组,在函数里面处理数组,那我们就需要定义好入参的类型了:
function identity<T>(arg: T[]): T[]{
console.log(arg.length);
return arg;
}
这样我们便定义了函数的入参类型为数组类型,T代表数组的每个元素的类型,函数里面获取了数组的长度。
这样应该对泛型有个初步的认识了。。。
1 条评论发表在 “Typescript 泛型理解之初识泛型”
阿的说法断水