一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
雄关漫漫真如铁,而今迈步从头越,ts
的学习还是被我拆成知识点的形式去学习吧,这样针对每个知识点在自己复习的时候更清晰吧。
1.函数泛型:
先来看下下面的场景:
function joinExample(first: string | number, second: string | number){
return `${first}${second}`;
}
那么如果我想让参数first
是number
类型的时候,second
也为number
类型,改如何处理呢?
泛型,顾名思义就是泛指的类型
,来看下面使用泛型解决上述问题的例子:
function join<T, P>(first: T, second: P) {
return `${first}${second}`;
}
function anotherJoin<T>(first: T, second: T): T {
return first;
}
// join<number, string>(1, '1');
// map<string>(['123']);
join(1, '1');
定义某个类型数组的方法:
下面例子中的两种数组的定义是一样的。
// T[](某个类型数组的写法)
function map<T>(params: Array<T>) {
return params;
}
// 或者
function map1<T>(params:T[]){
return params;
}
2.类中的泛型以及泛型的类型:
1.类中的泛型:
DataManager
是一个类,data
是一个string
的数组getItem
传入一个number
类型的索引,返回data
中相应的项
class DataManager{
constructor(private data:string[]){
}
getItem(index:number):string{
return this.data[index];
}
}
const data = new DataManager(["科比","艾弗森","麦迪","卡特"]);
data.getItem(0);
后续产品经理说,这个data
不仅仅是string
类型的数组,还要求可以是其他类型
的数组:
class DataManager1{
constructor(private data:string[] | number[]){
}
getItem(index:number):string | number{
return this.data[index];
}
}
如果这个data
数组将来内部可能会是更多类型,那么联合类型
的解决方案也就不是很方便了,因此有了泛型
:
class DataManager2<T>{
constructor(private data: T[]){
}
getItem(index:number):T{
return this.data[index];
}
}
const data2 = new DataManager2<string>(["123","456"]);
data.getItem(1);
2.泛型继承interface
接口的使用
如何能够让泛型拥有指定的属性(例如.name
)?
- 外部定义一个
interface
接口 - 让泛型
T
通过extends
去继承这个接口,在T
继承了Item
之后,T
必须要有接口Item
中定义的内容
interface Item {
name:string;
}
//T继承了Item之后,T必须要有接口Item中所有的东西
class DataManager3<T extends Item>{
constructor(private data: T[]){
}
getItem(index:number):string{
return this.data[index].name;
}
}
const data3 = new DataManager3([{name:"成为更好的自己"}]);
现在希望这个T
只能是number
或者是string
类型,那么又该如何处理呢?
- 直接让
泛型
去继承类型
class DataManager4<T extends number | string>{
constructor(private data:T[]){
}
getItem(index:number):T {
return this.data[index];
}
}
3.使用泛型作为一个具体的类型注解:
下面是一个拆解的形式,定义了一个函数gameBoy
const func: <T>(params:T) => T = gameBoy;
function gameBoy<T>(params:T){
return params
}