美文网首页
TypeScript -- 泛型

TypeScript -- 泛型

作者: _路明非_ | 来源:发表于2019-12-05 22:29 被阅读0次

1. 很多时候我们希望一个函数或者一个类可以支持多种数据类型,有很大的灵活性
2.泛型:不预先确定的数据类型,具体的类型在使用的时候才能确定
3.泛型好处
a. 函数和类可以支持多种类型,增强程序的扩展性;
b. 不必写多条函数重载,冗余的联合类型声明,增强代码可读性;
c. 灵活的控制了类型之间的约束;

一 泛型函数与泛型接口

// 一个打印函数
function log(value: string) {
    console.log(value);
    return value;
}
// 希望上面的打印函数可以接收一个字符串数组
// 函数重载
function log(value: string): string;
function log(value: string[]): string[];
function log(value: any) {
    console.log(value);
    return value;
}
// 联合类型
function log(value: string | string[]) {
    console.log(value);
    return value;
}
// 希望log可以接收任意类型
// any类型(问题:丢失了类型之间的关系,它忽略了输入的类型和返回的类型必须是一致的)
function log(value: any) {
    console.log(value);
    return value;
}

使用泛型改造log函数

// 泛型函数
// 类型T不需要预先指定,就相当于any类型
// 可以保存输入参数和返回值类型是一致的
function log<T>(value: T): T {
    console.log(value);
    return value;
}
// 两种调用方式
log<string[]>(['1','2']);
// 利用TS的类型推断,省略类型的参数
//推荐这种方式
log(['1','2']);

// 利用泛型定义一个函数类型
// type 类型别名
type Log = <T>(value: T) => T;
// 泛型函数的实现
let myLog: Log = log

// 泛型接口 (和类型别名的定义是完全等价的)
// 泛型紧紧约束了一个函数,也可以约束接口的其它成员
interface Log1 {
    <T>(value: T): T
}
// 这样接口的所有成员都受到了泛型的约束了
// 当泛型约束了整个接口之后,在实现的时候必须指定一个类型
interface Log2<T> {
    (value: T): T
}
// 必须指定类型,mylog2的参数只能是number
let myLog2: Log2<number> = log
// 设置默认值了,实现的时候就不需要必须指定一个类型了
interface Log2<T = string> {
    (value: T): T
}
let myLog3: Log2 = log
log('2')

二 泛型类与泛型约束

// 定义一个泛型类(<T>放在Log后面,约束类的所有成员)
// 泛型不能应用于类的静态成员
class Log<T> {
    run(value: T) {
        console.log(value);
        return value;
    }
}
// 实例化Log类,实例的方法将会受到泛型的约束
let log = new Log<number>()
log.run(1)
// 实例化的时候也可以不传入参数,不指定参数的时候value就可以是任意值
let log1 = new Log()
log1.run({a:1})


// 泛型约束,
// 希望打印出参数和参数的属性
interface LogLength {
    length: number;
}
function log3<T extends LogLength>(value: T): T {
    // 不存在length属性,需要预定义一个接口,T继承LogLength就好使了
    // 现在T就受到了一定的约束,就不是任意类型都可以传入了,输入的参数必须具有length属性
    console.log(value, value.length);
    return value;
}
log3([1])

相关文章

  • 2020-11-05Typescript(2.2)

    泛型 Generics---typeScript中最难的一部分 泛型 Generics---约束泛型 泛型 Gen...

  • TS 泛型+装饰器

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

  • bunny笔记|TS基础(2):泛型函数、泛型约束、在泛型约束中

    01 typescript的操纵类型 02 03 04 泛型约束 05 在泛型约束中使用类型参数 06 在泛型中使...

  • 03_TypeScript学习(三)

    一. TypeScript枚举类型 二. 枚举类型的值 三. 认识泛型 四. 泛型实现类型参数化 五. 泛型的基本...

  • TypeScript 学习笔记4 泛型

    1.泛型 1.1 泛型函数 1.2 泛型类 1.3 泛型接口 Typescript从0到1-学习视频教程-培训课程...

  • typescript

    title: typescript学习tags: typescript学习 [toc] 泛型 基本使用 两种使用方...

  • TypeScript 泛型

    泛型函数 使用 数组 类 泛型约束

  • TypeScript泛型

    有时候编程还要考虑它的复用性,很多时候不需要指定它的类型,或者同样的方法逻辑 但是入参和出差的类型不同。这个时候就...

  • TypeScript(泛型)

    泛型 软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同...

  • TypeScript -- 泛型

    1. 很多时候我们希望一个函数或者一个类可以支持多种数据类型,有很大的灵活性2.泛型:不预先确定的数据类型,具体的...

网友评论

      本文标题:TypeScript -- 泛型

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