TypeScript -- 泛型

什么是泛型

typescript 复制代码
1.泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的
类型,而在使用的时候再指定类型的一种特性。

2.我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。组件不仅能够支持
当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。  
在像c#和java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数
据。这样用户就可以以自己的数据类型来使用组件。

ts函数定义

typescript 复制代码
// 首先看一下ts函数的定义
function getData(value: string): string { // 传入值和返回值都限制了string类型
  return 'str'
}

当需要同时支持多个数类型的时候 这时怎么解决呢?

  • 用any类型
typescript 复制代码
function getData (value: any):any {
  return value
}

// 用了any就代表着放弃了类型的检查,一般我们都提倡严格限制类型,这时我们可以利用泛型来解决

泛型的写法

typescript 复制代码
1.我们在函数名后添加了 <T>,其中 T 用来指代任意输入的类型,在后面
的输入 value: T 和输出 Array<T> 中即可使用了。
2.T表示泛型(也可以取其他名字),具体什么类型是调用这个方法的时候决定的
typescript 复制代码
// 例子
function createArray<T>(length: number, value: T): Array<T> { 
  let result: T[] = [];
  for (let i = 0; i < length; i++) {
    result[i] = value;
  }
  return result;
}

createArray<string>(3, 'x'); // ['x', 'x', 'x']

多个类型参数

复制代码
泛型可以定义多个不同类型参数
typescript 复制代码
function swap<T, U>(tuple: [T, U]): [U, T] {
  return [tuple[1], tuple[0]];
}

swap<number, string>([7, 'seven']); // ['seven', 7]

函数表达式/函数别名/接口 --配合泛型写法

  • 函数表达式的定义方式
typescript 复制代码
let getArray: <T>(arg: T, times: number) => T[]
getArray = (arg: any, times: number) => {
  return new Array(times).fill(arg)
}
  • 接口类型
typescript 复制代码
interface GetArray<T> {
  (arg: T, times: number): T[],
  array: T[]
}

泛型类

typescript 复制代码
// 与泛型接口类型,泛型也可以定义在类的类型定义中

class GenericNumber<T> {
  zeroValue: T;
  add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };
复制代码
 需要注意的是:类有两部分: 静态部分和实例部分。泛型类值的是实例部分的类型,
所以类的静态属性不能使用这个泛型类型

案例:比如有最小堆算法,需要同时支持返回数字和字符串两种类型。通过类的泛型来实现

typescript 复制代码
class myClass<T> {
  public list:T[] = [];
  add (value: T): void {
    this.list.push(value)
  }
  min () : number {
    var min=arr[0];
    list.forEach((value)=>{
      if(value<min){
        min=value
      }
    })
    return min
  }
}

var m = new myClass<number>() //实例化,并且指定了泛型T的类型为number
m.add(2);
m.add(3);
m.add(5);
m.add(5);
m.add(7);
m.add(8);
alert(m.min()) //输出了最大值

泛型约束

复制代码
1.有时候我们想对泛型传入的参数加以约束,这时候使用泛型约束
2.思路就是让泛型类型去继承接口或者一些类,让在编译过程去检测传入的
泛型是具有当前指定的属性
typescript 复制代码
interface Lengthwise {
  length: number;
}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
  console.log(arg.length);
  return arg;
}

loggingIdentity(7);// 传入数字会报错 arg不包含length

泛型参数的默认类型

typescript 复制代码
function createArray<T = string>(length: number, value: T): Array<T> {
  let result: T[] = [];
  for (let i = 0; i < length; i++) {
    result[i] = value;
  }
  return result;
}
相关推荐
烛阴2 小时前
【TS 设计模式完全指南】用工厂方法模式打造你的“对象生产线”
javascript·设计模式·typescript
定栓2 小时前
Typescript入门-类型断言讲解
前端·javascript·typescript
Thetimezipsby5 小时前
基于Taro4打造的一款最新版微信小程序、H5的多端开发简单模板
前端·javascript·微信小程序·typescript·html5·taro
流影ng6 小时前
【TypeScript】闭包
typescript
葡萄城技术团队7 小时前
TypeScript 队列实战:从零实现简单、循环、双端、优先队列,附完整测试代码
typescript
烛阴1 天前
【TS 设计模式完全指南】从“入门”到“劝退”,彻底搞懂单例模式
javascript·设计模式·typescript
lypzcgf1 天前
Coze源码分析-资源库-删除插件-前端源码-核心组件实现
前端·typescript·前端框架·react·coze·coze插件·智能体平台
江拥羡橙1 天前
【目录-单选】鸿蒙HarmonyOS开发者基础
前端·ui·华为·typescript·harmonyos
叫我阿柒啊1 天前
从Java全栈到Vue3实战:一次真实面试中的技术探索
java·数据库·spring boot·微服务·typescript·vue3·restful
江拥羡橙2 天前
【目录-多选】鸿蒙HarmonyOS开发者基础
前端·ui·华为·typescript·harmonyos