• TypeScript泛型


    什么是泛型?

    "泛"就是广泛的意思,"型"就是数据类型。顾名思义,泛型就是适用于多种数据类型的一种类型。

    泛型的作用

    它能够帮助我们构建出复用性更强的代码

    1. function getResult(value: number): number {
    2. return value
    3. }

    例如,我们希望传参类型和函数返回类型一致时。我们可以使用泛型。

    使用泛型

    1. function getResult(value: T): T {
    2. return value
    3. }

    在定义一个函数时,不决定这些参数的类型,而是让调用者以参数的形式告知函数参数应该是什么类型。

    里的T便是TS的类型变量,也就是把T看做额外的一个参数,把类型参数化。

    怎么传入泛型

    函数定义时,<>的位置就是泛型的传入位置,比如上面函数的

    getResult(100) // 泛型收缩为数字

    sum<{name: string}>({ name: "zs" }) // 泛型收缩为引用对象

    或者我们可以让TS通过类型推导 自动识别:

    getResult(100) 

    sum({ name: "zs" }) 

     常用的泛型类型

    • T:Type的缩写,类型
    • K、V:key和value的缩写,键值对
    • E:Element的缩写,元素
    • O:Object的缩写,对象

    泛型类型不是一定要使用T来表示类型。只是大家常用T表示类型。

    TS允许引入希望定义的任何名字的类型变量。比如我们引入一个新的类型变量 U,重写上面getResult方法。

    1. function getResult(val:U):U{return val}
    2. getResult<number>(100)

    同时引入希望定义的任何数量的类型变量

    1. function sumNew(val:U,count:A):number{return 300}
    2. sumNew(3,'ss')

    泛型与接口

    在定义接口的时候也可以使用泛型来对接口内的成员进行类型约束。

    1. interface IInfo {
    2. name: T1
    3. age: T2
    4. }

    使用泛型接口:

    1. const info: IInfo<string, number> = {
    2. name: "zs",
    3. age: 25
    4. }

    泛型接口有类型默认值但是没有类型推导(函数传参不能使用,但是函数传参有类型推导)

    1. // 泛型接口定义默认类型
    2. interface IPersonstring, T2 = number> {
    3. name: T1
    4. age: T2
    5. }
    6. const p: IPerson = {
    7. name: "chenyq",
    8. age: 123
    9. }

    类型推导报错:

    泛型与类

    1. class Point {
    2. x: T
    3. y: T
    4. z: T
    5. constructor(x: T, y: T, z: T) {
    6. this.x = x
    7. this.y = y
    8. this.z = y
    9. }
    10. }
    1. // 泛型类自动推导类型
    2. const point1 = new Point("1.33.2", "2.22.3", "4.22.1")
    1. // 泛型类明确泛型类型
    2. const point2 = new Point<string>("1.33.2", "2.22.3", "4.22.1")
    const point3: Point<string> = new Point("1.33.2", "2.22.3", "4.22.1")

    泛型与数组

    1. // 定义字符串数组
    2. const arr1: string[] = ["a", "b", "c"]
    3. const arr2: Array<string> = ["a", "b", "c"]

    泛型约束

    泛型除了指定具体类型,还可以通过某类特征指定类型。

    比如string和array都是有length的,或者某些对像也是会有length属性的。

    我们想写一个函数,只接受含有length属性的参数,该怎么写?

    定义一个接口,指定length属性

    1. interface hasLength {
    2. length: number
    3. }

    用一个继承hasLength的接口做泛型约束:

    1. function fn (arg:T) {
    2. console.log(arg)
    3. }
    1. function fnextends hasLength> (arg:T) {
    2. console.log(arg)
    3. }

  • 相关阅读:
    通过Dockerfile build mysql镜像 初始化mysql数据库
    Java基础 --- 线程状态 Thread States
    Fluorescein-PEG-CLS,胆固醇-聚乙二醇-荧光素用于缩短包封周期
    马士兵老师JVM调优(修订版)
    WPF程序中 Invoke的使用
    【考研复试】计算机专业考研复试英语常见问题四(优缺点/观点/观念篇)
    Cassandra介绍(二)
    [杂记]C++中移动语义与完美转发的一些理解
    Web3时代:探索DAO的未来之路
    远程访问本地jupyter notebook服务 - 无公网IP端口映射
  • 原文地址:https://blog.csdn.net/weixin_42274805/article/details/132819568