【TypeScript】你需要了解的泛型

1.泛型的概念

泛型:软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。

在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。

通俗理解:泛型就是解决 类 接口 方法的复用性、以及对不特定数据类型的支持(类型校验)

2.泛型的数据类型

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

要求:传入的参数和返回的参数一直

T表示泛型,具体什么类型是调用这个方法的时候决定的

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

3.泛型类

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

在整个类中都可以使用这个类型

class MinClas<T>{

    public list:T[]=[];

    add(value:T):void{

        this.list.push(value);
    }

    min():T{        
        var minNum=this.list[0];
        for(var i=0;i<this.list.length;i++){
            if(minNum>this.list[i]){
                minNum=this.list[i];
            }
        }
        return minNum;
    }
}

4.泛型接口

interface ConfigFn<T>{
    (value:T):T;
}
function getData<T>(value:T):T{
    return value;
}
var myGetData:ConfigFn<string>=getData;
myGetData('20');  /*正确*/

5.小结

  • 接口:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范

  • 泛型 通俗理解:泛型就是解决 类 接口 方法的复用性、

6.补充1: 泛型约束

// example 1
interface LengthWise {
    length: number
}

function loggingIdentity<T extends LengthWise>(arg: T) : T {
    console.log(T.length) // 通过泛型约束 不会报错
    return arg
}

// example 2
// 希望传入一个对象和一个key,这个key又存在于对象当中
function getProperty<T, K extends keyof T>(obj: T, key: K) {
    return obj[key]
}

let x = {a: 1, b: 2, c: 3}

getProperty(x, 'a') // right
getProperty(x, 'm') // error

// example 3
// 在工厂函数中的应用
function create<T>(c: {new(): T}):T {
    return new c()
}
// example 4
// 高级用户 工厂函数的应用
class BeeKeeper {
    hasMask: boolean
}

class LionKeeper {
    nameTag: string
}

class Animal {
    numLengths: number
}

class Bee extends Animal {
    keeper: BeeKeeper
}

class Lion extends Animal {
    keeper: LionKeeper
}

function createInstance<T extends Animal>(c: new() => T): T {
    return new c()
}

createInstance(Lion).keeper.nameTag
createInstance(Bee).keeper.hasTask

posted @ 2019-08-11 20:36  林璡  阅读(220)  评论(0编辑  收藏  举报