我的日常开发记录日志
首页
  • Laravel
  • Thinkphp
  • Swoole
  • Workman
  • php
  • HTML
  • CSS
  • JavaScript
  • Vue
  • ES6
  • 小程序
  • Mysql
  • Redis
  • Es
  • MongoDb
  • Git
  • Composer
  • Linux
  • Nginx
  • Docker
  • Vpn
  • 开发实战
  • 开发工具类
  • 友情链接
💖关于
💻收藏
  • 分类
  • 标签
  • 归档数据
GitHub (opens new window)

我的日常开发记录日志

never give up
首页
  • Laravel
  • Thinkphp
  • Swoole
  • Workman
  • php
  • HTML
  • CSS
  • JavaScript
  • Vue
  • ES6
  • 小程序
  • Mysql
  • Redis
  • Es
  • MongoDb
  • Git
  • Composer
  • Linux
  • Nginx
  • Docker
  • Vpn
  • 开发实战
  • 开发工具类
  • 友情链接
💖关于
💻收藏
  • 分类
  • 标签
  • 归档数据
GitHub (opens new window)
  • html

  • css

  • javascript

  • vue

  • 小程序

  • Es6

    • ES6
    • ts基础
    • ts注解
    • ts泛型
      • ts对象接口类型
      • vue使用js转换到ts差异
    • 前端
    • Es6
    窝窝侠
    2024-11-19

    ts泛型

    # TypeScript 泛型与类型参数的解析

    TypeScript 的泛型(Generics)允许在函数、类、接口等结构中使用类型参数,使得它们能够处理多种类型而不需要为每种类型编写单独的代码。通过类型参数,可以使代码更加灵活、复用性更强,并且保持类型安全。本文将详细解析泛型中的类型参数,尤其是如何使用 T 作为占位符类型,并在函数调用时进行类型推导。

    # 1. 泛型的定义

    在泛型函数中,T 是一个 类型变量,它表示一个占位符类型,可以在调用时被具体类型替代。这使得函数可以处理任意类型的输入和输出,而不局限于某个特定类型。具体来说,T 是函数 identity 的类型参数,表示函数的输入和输出都是相同类型。

    例子:

    function identity<T>(value: T): T {
      return value;
    }
    
    1
    2
    3

    在这个函数中:

    • T 是一个类型参数,代表函数的输入和输出类型。
    • value: T 表示 value 参数的类型是 T,即任意类型。
    • : T 表示函数的返回值类型也是 T,即与输入类型一致。

    # 2. 调用时类型推导

    TypeScript 可以在函数调用时自动推导出 T 的具体类型。让我们看一下具体例子:

    const num = identity(42);  // T 被推导为 number
    console.log(num);  // 输出 42
    
    const str = identity("hello");  // T 被推导为 string
    console.log(str);  // 输出 "hello"
    
    1
    2
    3
    4
    5
    • 当调用 identity(42) 时,TypeScript 会推导出 T 为 number,并且返回值类型也会是 number。
    • 同样,当调用 identity("hello") 时,T 会被推导为 string。

    # 3. 显式指定类型

    除了自动推导类型外,你还可以显式指定泛型类型参数。例如:

    const num = identity<number>(42);  // 显式指定 T 为 number
    console.log(num);  // 输出 42
    
    const str = identity<string>("hello");  // 显式指定 T 为 string
    console.log(str);  // 输出 "hello"
    
    1
    2
    3
    4
    5

    在这里,<number> 和 <string> 明确告诉 TypeScript 函数的输入输出类型分别是 number 和 string。

    # 4. 泛型的应用场景

    泛型不仅在函数中使用,还可以应用在类和接口中,帮助你构建类型安全、灵活可复用的代码。

    # 4.1 类中的泛型
    class Box<T> {
      value: T;
      constructor(value: T) {
        this.value = value;
      }
    }
    
    const numBox = new Box(42);  // T 被推导为 number
    const strBox = new Box("hello");  // T 被推导为 string
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    在这个例子中,Box 是一个泛型类,T 可以代表任何类型。在实例化时,T 被推导为具体的类型(如 number 或 string)。

    # 4.2 接口中的泛型
    interface Pair<T, U> {
      first: T;
      second: U;
    }
    
    const pair: Pair<number, string> = { first: 1, second: "one" };
    
    1
    2
    3
    4
    5
    6

    接口 Pair 具有两个类型参数 T 和 U,它们分别代表 first 和 second 的类型。在实例化时,可以指定具体的类型(如 number 和 string)。

    # 5. 类型参数的作用

    • 类型抽象:类型参数使得函数、类、接口能够处理多种类型,而不需要为每种类型编写单独的代码。
    • 类型安全:TypeScript 会确保你在调用泛型函数时传入的类型是正确的,避免类型错误。
    • 复用性:泛型帮助你创建可以复用的代码,适用于不同的类型,同时保持类型安全。

    # 6. TypeScript 类型推导与注解

    在 TypeScript 中,并不是所有的变量都需要显式类型注解,TypeScript 会根据上下文自动推导变量的类型。即使 TypeScript 可以推导出类型,在某些情况下显式注解依然有助于提高代码的可读性、可维护性,并且有助于提前发现错误。

    # 6.1 类型推导
    let count = 5;  // TypeScript 会推导出 `count` 的类型是 `number`
    
    1

    TypeScript 会根据变量的初始值或上下文自动推导出变量的类型。

    # 6.2 显式类型注解
    let count: number = 5;  // 显式注解 `count` 为 `number` 类型
    
    1

    通过显式类型注解,你可以明确指定变量的类型,帮助其他开发人员理解代码的意图,并提升代码的可读性。

    # 6.3 VSCode 中的类型提示

    在加上类型注解后,VSCode 会根据类型提供以下功能:

    • 自动完成(IntelliSense):根据类型提供智能提示,帮助你选择合适的属性或方法。
    • 类型信息:当你将光标悬停在一个变量或函数上时,VSCode 会显示该变量的类型信息。
    • 错误提示:如果你尝试将错误的类型赋给变量,VSCode 会及时提供错误提示。

    # 7. 总结

    • 泛型类型参数(如 T)是 TypeScript 中的占位符类型,表示函数、类、接口等可以处理任意类型。
    • 类型推导:TypeScript 会根据函数调用时的实际参数类型自动推导出泛型类型参数。
    • 显式注解:虽然 TypeScript 可以推导类型,但显式注解可以提高代码的可读性、可维护性,并避免潜在的类型错误。
    • 灵活性与类型安全:泛型使代码更加灵活,同时保持类型安全,使得函数、类、接口等可以处理不同类型而无需重复编写多个版本。

    通过使用泛型,你可以编写更加灵活、可复用的代码,同时确保类型的安全性,避免类型错误。

    在线编辑 (opens new window)
    上次更新: 2025/02/25, 18:30:54
    ts注解
    ts对象接口类型

    ← ts注解 ts对象接口类型→

    最近更新
    01
    showprocess用法
    04-29
    02
    vue3中尖括号和冒号的使用细则
    04-29
    03
    sd使用
    02-22
    更多文章>
    🖥️

    © 2025窝窝侠 💌 豫ICP备20005263号-2 🛀 Theme by 💝 Vdoing && 小胖墩er

    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×