TypeScript中的范型

作者: 大拧巴 | 来源:发表于2019-06-20 20:28 被阅读1次

一、定义

比如我们有一个函数,如果不使用范型是这样的

function getData(arg: number): number {
    return arg;
}

它只能传入number类型,如果我们要传入一个string类型的是编译不通过的,所以我们可以写另一个函数或者用any类型

function getData1(arg: string): string {
    return arg;
}
function getData2(arg: any): any {
    return arg;
}

那么问题来了,如果重新写那么我们就不能做到复用了,如果用any就不能保证传进去的类型和传出来的类型统一,所以我们有了范型

function getData<T>(arg: T): T {
    return arg;
}
getData<number>(123)
getData<string>(123)
getData(false)//利用了类型推论,编译器会根据传入的参数自动地帮助我们确定T的类型

T:表示范型,具体什么类型是调用的这个方法的时候决定的(注意:T也可以是任意其他字母)
所以范型可以支持不确定的数据类型,传入的参数和返回值的类型一致。

二、范型变量

如果我们想打印一个数组的长度

function getLength<T>(arg: T): T {
    console.log(arg.length);  // Error: T doesn't have .length
    return arg;
}

如果这么做,编译器会报错说我们使用了arg的.length属性,但是没有地方指明arg具有这个属性。 记住,这些类型变量代表的是任意类型,所以使用这个函数的人可能传入的是个数字,而数字是没有.length属性的。<br />
现在假设我们想操作T类型的数组而不直接是T。由于我们操作的是数组,所以.length属性是应该存在的。 我们可以像创建其它数组一样创建这个数组:

function getLength<T>(arg: T[]): T[] {
    console.log(arg.length);  // Array has a .length, so no more error
    return arg;
}

三、范型类

泛型类使用(<>)括起泛型类型,跟在类名后面。

class Minclass<T> {
    public list: T[] = []
    add(value: T):void {
        this.list.push(value)
    }
    min():T{
        let minNum = this.list[0]
        for(let i =0; i < this.list.length; i++){
            if(minNum > this.list[i]){
                minNum = this.list[i]
            }
        }
        return minNum
    }
}
let m = new Minclass<number>()
m.add(2)
m.add(6)
m.min() //2
let s = new Minclass<string>()
s.add('m')
s.add('c')
s.min()//c

四、范型接口

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

通用范型接口:

function getData<T>(value:T):T{
    return value
}
interface ConfigFn<T>{
    (value:T):T
}
let getData:ConfigFn<string> = getData
let getData1:ConfigFn<number> = getData

五、在泛型约束中使用类型参数

class User{
    username: string
    password: string
}
class Mysql{
    add (user:User):boolean{
        console.log(user)
        return true
    }
}
let u = new User()
u.username = '张三'
u.password = '123'
let m = new Mysql()
m.add(u)

我们可以通过范型约束来更好的实现上面的代码

class Mysql<T>{
    add(info:T):boolean{
        console.log(Info)
        return true
    }
}
let u = new User()
u.username = '张三'
u.password = '123'
let my = new Mysql<User>()
my.add(u)

相关文章

  • TypeScript中的范型

    一、定义 比如我们有一个函数,如果不使用范型是这样的 它只能传入number类型,如果我们要传入一个string类...

  • typescript范型

    范型:支持不特定的类型,要求传入的参数和返回的参数保持一致。1 基本例子 2 泛型变量 3 泛型类 4 泛型约束 ...

  • TypeScript学习- 范型

    泛型是类型推断的产物,其目的是为了提高代码复用性。在其他强类型语言中,泛型常用来写可重用的组件,使组件可以支持多种...

  • typescript中的泛型

    什么是泛型 泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型...

  • TypeScript中的泛型

    一、泛型的定义 泛型(Generics)是指在定义函数、接口或者类的时候, 不预先指定其类型,而是在使用时手动指定...

  • CoreJava笔记 - 范型程序设计(5)

    反射与范型 由于类型擦除,反射无法得到关于范型类型参数的信息。 范型的Class类在Java的反射库中,Class...

  • TS 泛型+装饰器

    typescript 中的泛型 泛型的定义泛型函数泛型类泛型接口 泛型:软件工程中,我们不仅要创建一致的定义良好的...

  • python 函数 map 、lambda

    开篇就要提到一个大的话题:编程范型。什么是编程范型?引用维基百科中的解释: 编程范型或编程范式(英语:Progra...

  • Java中的泛型/范型

    维基百科中关于Java泛型的描述 Java 泛型的参数只可以代表类,不能代表个别对象。由于Java泛型的类型参数之...

  • Rust范型(2) - 范型约束

    trait中的范型 在定义trait时,可以使用范型: Dagongren是一个trait,包含了banzhuan...

网友评论

    本文标题:TypeScript中的范型

    本文链接:https://www.haomeiwen.com/subject/sjksqctx.html