我们先定义一个东西
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和返回值的类型是T
return 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
里面新加的。