Type Script 之 泛型

泛型,在ts的类型中我认为可以看成一个类型的变量,让原先定死的“常量类型”在ts语法中自由的穿梭
在阅读本章之前我希望读者有个这样的思维:在一个方法中,TS的基本类型都是常量,如:number,string,undefined等等。而我们今天要讲的泛型,可以理解为是变量。

一、泛型基础

function fn<T>(leng:number,value:T):Array<T>{
	let arr=[];
	for(let i=0;i<leng;i++){
		arr.push(value);
	};
	return arr;
};
fn(3,'k')//['k','k','k'];

这是一个以第一个参数为长度返回一个数组,值为第二个参数的方法。
接下来我们来解读下上面这个例子。

1、变量的声明。
和普通ts方法不同,泛型的方法在 方法名后面,形参括号前面加了个尖括号,这里以<>包住一般用大写字母来区分其他参数。这就是我们声明的‘变量’了。那问题来了,变量是怎么赋值的呢?不用担心,它是自动赋值的。

2、变量的绑定
在形参的括号里,跟在形参后面的 正常我们要赋予形参常量的时候(leng:number),将我们的常量替换成大写的变量(value:T)。这样value的类型就是成为了一个变量 T 。

3、变量的输出
既然是一个方法,那么都有一个输出值(默认是void),特别是泛型,它的意义就是在于将输入和输出的类型统一。最后这部分其实就挺好理解了,只要吧我们原本放常量的位置替换成我们的变量就好了。

4、变量的赋值
前面说了变量的赋值是自动的,其实就是在方法调用的时候,传入的对应形参的类型是什么,那么最终赋值给我们变量的类型就是什么。比如上面传入一个字符串’k’,它的类型推论(Type Inference)其类型就是string那么最终赋值给T上的类型就是string。如果将’k’改为随便一个数字,那么T的值也会变成number。

二、多类型

function fn<T,N>(arr:[k:T,n:N]):[N,T]{
	return [arr[1],arr[0]]
};
fn([3,'k'])//['k',3];

多类型其实就是在第一个尖括号里多声明几个“变量”。

三、注意

因为无法确定传入参数是什么属性,所以一些独有的方法以及属性就无法读取到。比如:length。如何避免呢?

function fn<T='string',N>(arr:[k:T,n:N]):[N,T]{

在 TypeScript 2.3 以后,我们可以为泛型中的类型参数指定默认类型。当使用泛型时没有在代码中直接指定类型参数,从实际值参数中也无法推测出时,这个默认类型就会起作用。

你可能感兴趣的:(Type,Script,typescript)