typescript(4):泛型

泛型

  1. 介绍

    可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据

    // 返回值的类型与传入参数的类型相同
    function identity<T>(arg: T):T{
        return arg
    }
    
  2. 使用泛型变量

    使用泛型创建像 identity 这样的泛型时,编辑器要求在函数体必须正确的使用这个通用的类型。也就是说,必须把这个参数当做是任意或者所有类型

    // 不确定arg的类型,是不是有Length属性
    function identity<T>(arg: T):T {
        console.log(arg.length) // error
    }
    // 更改
    function identity<T>(arg: T[]):T[] {
        console.log(arg.length)  // success
    }
    
  3. 泛型类型

    泛型函数的类型与非泛型函数的类型没有什么不同,只是有一个类型参数在最前面,像函数声明一样

    function identity<T>(arg: T):T {
        return arg
    }
    
    let myIdentity = <T>(arg: T) => T = identity;
    

    也可以使用不同的泛型参数名,只要在数量上和使用方式上能对应上就可以

    function identity<T>(arg: T):T {
        return arg
    }
    
    let myIdentity = <U>(arg: U) => U = indentity
    

    还可以使用带有调用签名的对象字面量来定义泛型函数

    function identity<T>(arg: T):T {
        return arg
    }
    
    let myIdentity: {<T>(arg: T): T} = identity
    

    泛型接口

    interface Config {
        <T>(arg: T): T
    }
    function indetity<T>(arg: T):T {
        return arg
    }
    let myIdentity: Config = identity
    
  4. 泛型类

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

    // 泛型类指的是实例部分的类型,所以类的静态属性不能使用这个泛型约束
    class Demo<T> {
        name: T
        handle: (x: T, y: T) => T
    }
    
  5. 泛型约束

    定义一个接口描述约束条件

    // 使用config接口和extends实现约束
    interface config {
        length: number
    }
    
    function indentity<T extends config>(arg: T): T {
        console.log(arg.length)
    }
    

    在泛型中使用类型参数

    // 声明一个类型参数,且被另一个类型参数所约束
    function select(obj: T, key: K) {
        return obj[key]
    }
    
    let x = {a: 1, b: 2, c: 2}
    
    select(x, 'a')  // success
    select(x, 'm')  // error
    

    在泛型里使用类类型

    // 在typescript使用泛型创建工厂函数时,需要引用构造函数的类类型
    function create<T>(c: {new(): T}): T {
        return new c()
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值