我们先定义一个东西
function fn(a:number):number{return a;}
这个函数就是接收一个a然后把a的值返回。
我们用这个说明一个问题:
我们去定义一个函数,定义一个类或变量的时候,我们都知道的类型是a:number知道返回值是number。但是有一些情况下,我们不知道参数的类型的时候,我们返回值的类型也不知道是啥
这个时候我们遇到不确定类型那怎么办?
我们可以写
any但是我们之前说了any的问题就是any后会关闭我们ts中的类型检查,如果用any这个类型就没有意义了。而且从函数的类型和返回值来看,我们不能看出返回值的类型是和a是一样的。
凡是遇到类型不明确的时候,我们就可以使用泛型
泛型
在定义函数或者类时,如果遇到类型不明确就可以使用泛型
泛型就是一个不确定的类型
根据调用的情况来具体的去看这种情况
泛型怎么去具体的指定?
function fn<T>
泛型<K>不一定都叫K,这里指定为泛型T,名字无所谓
T:就表示任意类型,感觉就像是一个变量
后面就跟普通方法一样了:
function fn<T>*(a:T):T{//表示a和返回值的类型是Treturn a;}
这样,这个函数就定义好了,但是T具体是什么类型?
不知道。这个类型只有在函数执行的时候才可以去确定
好处:
- 1.首先不用
any,any吧类型检查跳过了 - 2.体现出了我的参数和返回值它的类型是相同的
怎么用?
fn(10)
因为我们a的类型是10(number)它会自动判断出a的类型是number,也就是把number赋值给了T,也就意味着这个T的值就是number。但是这里用到了ts里类型的自动判断。
要是有的时候自动推断不出来,我们可以这么写:
fn<string>('hello');
这个时候我们就手动的指定这个T是string
好处是:类型是明确的
泛型可以指定多个
function fn2<T,K>(a:T,b:K):T{console.log(b);return a;}fun2(123,'hello');//自动推断fun2<number,string>(456,'hi');//最好还是手动的添加上,以免出错的机率
但是我们这样,我们的泛型可以是任意类型,那有一些情况下我想限制一下泛型的范围
限制泛型的范围
interface Inter{length:number;}function fn3<T extends Inter>(a:T):number{return a.length}
总结
- 泛型可以同时指定多个
**T extends Inter**表示这个泛型必须是**Inter**的实现类(子类)- 在我们类中也可以定义
**泛型**
class MyClass<T>{name: T;//用的时候也一样constructor(name:T){this.name = name;}}//泛型是一个井上添花的东西,不是一定要使用const mc = new MyClass<string>('孙悟空')
关于抽象类、接口、泛型在js里面都是没有的,都是在ts里面新加的。
