TS之泛型

Posted codexlx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TS之泛型相关的知识,希望对你有一定的参考价值。

1.泛型:

  • 在软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。组件不仅能支持当前数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能
  • 在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。这样用户就可以以自己的数据类型来使用组件
  • 简而言之:泛型就是解决 类、接口、方法的复用性,以及对不特定数据类型的支持

在ts中,比如一个函数要支持传入类型与返回类型支持多种数据类型,可以使用any,any就是完全放弃了数据类型检查

ts中的泛型:<T>

  可以支持不特定的数据类型

  要求,传入的参数和返回的参数一致

function getData<T>(value: T): T {
  return value;
}

// 类型检查和传入参数必须一致
console.log(getData<number>(123));
console.log(getData<string>(‘abc‘));

 2.泛型类:

  如有个方法,需要同时支持返回字符串和数字两种类型,需要通过泛型类来实现

class MinClass<T>{
  public list: T[] = [];

  add(value: T): void {
    this.list.push(value);
  }

  min(): T {
    let minNum = this.list[0];
    for (let e of this.list) {
      if (minNum > e) {
        minNum = e
      }
    }
    return minNum;
  }
}

// 制定类的代表类型是number
let m = new MinClass<number>();   //实例化类,并且制定了类的代表类型是number
m.add(5);
m.add(9);
m.add(12);
m.add(4);
console.log(m.min());

// 制定类的代表类型是number
let m1 = new MinClass<string>();
m1.add(‘d‘);
m1.add(‘f‘);
m1.add(‘z‘);
m1.add(‘q‘);
console.log(m1.min());

 3.泛型接口

先看看函数类型接口:

interface ConfigFn{
  (value1:string,value2:string):string;
}

let setData:ConfigFn=function(v1:string,v2:string):string{
  return v1+v2;
}

setData(‘name‘,‘张三‘);

 

泛型接口:

interface ConfigFn {
  <T>(value: T): T;
}

// function getData<T>(value:T):T{}
let getData: ConfigFn = function <T>(value: T): T {
  return value;
}

getData<string>(‘张三‘);
getData<number>(123);

 

 4.把类作为参数类型的泛型类

(1)

class User {
  username: string | undefined;
  password: string | undefined
}

class mysqlDb {
  // 用User这个类来验证传入数据的合法性
  add(user: User): boolean {
    return true;
  }
}

// 增加数据 let u
= new User(); u.username = ‘张三‘; u.password = ‘123456‘; let Db = new MysqlDb(); console.log(Db.add(u));

 

(2)泛型类实现

class MysqlDb<T> {
  add(info: T): boolean {
    console.log(info);
    return true;
  }
}

class User {
  username: string | undefined;
  password: string | undefined
}


let u = new User();
u.username = ‘张三‘;
u.password = ‘123456‘;

// 对不特定类型进行类型校验
let Db = new MysqlDb<User>();
Db.add(u);

 

以上是关于TS之泛型的主要内容,如果未能解决你的问题,请参考以下文章

Typescript入门手册之泛型

Typescript入门手册之泛型

iOS开发-Swift进阶之泛型!

javaSE之泛型(Generics)

[泛型]C# 之泛型详解

C#之泛型