当前位置: 首页 > news >正文

泛型(Generics)what why when【前端TS】

我总是提醒自己一定要严谨严谨严谨

目录

  • TypeScript 泛型 (Generics)
    • 1. 什么是泛型?
    • 2. 为什么需要泛型?
    • 3. 泛型常见用法
      • 3.1 函数泛型
      • 3.2 接口泛型
      • 3.3 类泛型
      • 3.4 泛型约束
      • 3.5 泛型默认值
      • 3.6 多个泛型参数
    • 4. 泛型应用场景

TypeScript 泛型 (Generics)

1. 什么是泛型?

泛型是一种在定义函数、类、接口时不预先指定具体类型,而在使用时再指定类型的机制。

作用:

  • 提高代码复用性
  • 保持类型安全

2. 为什么需要泛型?

示例:没有泛型的函数

function identity(arg: any): any {return arg;
}

问题:类型丢失(返回值是 any),类型不安全

使用泛型:

function identity<T>(arg: T): T {return arg;
}const num = identity<number>(123); // 类型推断为 number
const str = identity("hello");     // 类型推断为 string

3. 泛型常见用法

3.1 函数泛型

function getFirst<T>(arr: T[]): T {return arr[0];
}const firstNum = getFirst<number>([1, 2, 3]); // number
const firstStr = getFirst(["a", "b", "c"]);   // string(类型推断)

3.2 接口泛型

interface ApiResponse<T> {code: number;data: T;message: string;
}const userResponse: ApiResponse<{ id: number; name: string }> = {code: 200,data: { id: 1, name: "Alice" },message: "success"
};

3.3 类泛型

class Stack<T> {private items: T[] = [];push(item: T) {this.items.push(item);}pop(): T | undefined {return this.items.pop();}
}const numberStack = new Stack<number>();
numberStack.push(1);const strStack = new Stack<string>();
strStack.push("a");

3.4 泛型约束

interface HasLength {length: number;
}function logLength<T extends HasLength>(arg: T): T {console.log(arg.length);return arg;
}logLength("hello");      // ✅ 字符串有 length
logLength([1, 2, 3]);    // ✅ 数组有 length
// logLength(123);       // ❌ number 没有 length

3.5 泛型默认值

function getValue<T = string>(value: T): T {return value;
}const v1 = getValue(123);       // 推断为 number
const v2 = getValue(undefined); // 默认类型 string

说明:

  • 如果传入值能推断类型,则用推断类型
  • 如果无法推断,则使用泛型默认值

3.6 多个泛型参数

function mapPair<K, V>(key: K, value: V): [K, V] {return [key, value];
}const pair = mapPair("id", 123); // [string, number]

4. 泛型应用场景

  • 集合类:如 Stack、Queue、Map 等
  • 工具函数:如 identity、getFirst、mergeObjects
  • 接口/类型定义:API 返回数据结构复用
  • React / Vue Hooks:如 useState、ref
  • 第三方库:如 Lodash、Axios 等

泛型 = 参数化的类型


文章转载自:

http://MhMfHSsO.rzysq.cn
http://9R5l2nO0.rzysq.cn
http://gQLfviGQ.rzysq.cn
http://vRYsAenj.rzysq.cn
http://eGlRApKb.rzysq.cn
http://JnxpHeCB.rzysq.cn
http://6DcV4w9G.rzysq.cn
http://9UuAWmqA.rzysq.cn
http://C0rryBZX.rzysq.cn
http://yKZjal5T.rzysq.cn
http://ZhSeRHM7.rzysq.cn
http://4AjRW8ja.rzysq.cn
http://CNvZZKWq.rzysq.cn
http://X4ZICW8b.rzysq.cn
http://IVm0uo7t.rzysq.cn
http://Jc9zqH9q.rzysq.cn
http://N043nYGt.rzysq.cn
http://q4uU0YIB.rzysq.cn
http://9LqblSCu.rzysq.cn
http://KB1qtjSz.rzysq.cn
http://hTK1XqyX.rzysq.cn
http://SaQLicbZ.rzysq.cn
http://uUdTpwxd.rzysq.cn
http://fAXWZV9F.rzysq.cn
http://BRzNoE1g.rzysq.cn
http://jHNu7lRY.rzysq.cn
http://0RsU3E6a.rzysq.cn
http://6x6032jZ.rzysq.cn
http://Q2OX9eRf.rzysq.cn
http://6R7AVpN8.rzysq.cn
http://www.dtcms.com/a/384421.html

相关文章:

  • 优化神经网络模型以提升R²值至0.99的全面方案
  • AR眼镜:远程协作的“破局者”,让问题解决“云手帮”
  • 本地部署 GPS 跟踪系统 Traccar 并实现外部访问
  • 【Pycharm】“无法载入新的虚拟环境,加载框一闪而过,只能加载conda虚拟base环境”的问题解决方法
  • JVM-运行时内存-虚拟机栈与本地方法栈
  • Matplotlib定制:精解颜色、字体、线型与标记
  • 让AI帮助我们将Python程序打包EXE可执行文件的完整指南
  • vs2019远程调试——设置远程机器上的include目录和so目录
  • 如何使用 Spring Boot、Kafka 和 Kubernetes 构建可扩展的消息处理应用
  • 贪心算法应用:手术室排程问题详解
  • ZooKeeper深度性能优化指南:从原理到实战的全面调优
  • 2025软件测试高频面试题
  • 【论文阅读】Diff-Privacy: Diffusion-based Face Privacy Protection
  • 第四篇:【基础篇】Python的“单词”与“语法”:深入理解变量、关键字与标识符
  • Python的输出缓冲区机制
  • Scikit-learn 简单介绍入门和常用API汇总
  • [Dify] 用多个工具节点构建多轮 API 调用任务流:链式任务设计实战指南
  • Java实战:从零开发图书管理系统
  • 认知语义学中的隐喻对人工智能自然语言处理的深层语义分析的启示与影响研究报告
  • Mysql数据库事务全解析:概念、操作与隔离级别
  • Halcon 常用算子
  • 基于Spring Boot与Micrometer的系统参数监控指南
  • 【高并发内存池——项目】定长内存池——开胃小菜
  • 作为注册中心zk和nacos如何选型
  • 前置配置3:nacos 配置中心
  • Linux —— 进程的程序替换[进程控制]
  • [Linux] 从YT8531SH出发看Linux网络PHY驱动
  • ArcGIS定向影像(2)——非传统影像轻量级解决方案
  • 分享机械键盘MCU解决方案
  • Unity 性能优化 之 编辑器创建资源优化(UGUI | 物理 | 动画)