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

TypeScript 极简指南:那个尖括号 <T> 到底是什么?

在接触 Vue 3 + TypeScript 项目时,你一定见过这种写法:

interface PageResult { list: T[]; total: number; }

或者是:

const result: PageResult<User[]> = ...

很多初学者看到这个尖括号<T>就头大:“这又是什么新语法?”

别被它吓跑了。今天我们抛开晦涩的术语,用最通俗的生活案例,带你彻底搞懂 TypeScript 中的泛型


一、 什么是泛型?

简单来说,泛型 就是一个“占位符”

你可以把它想象成我们在填空题里留下的下划线_,或者是编程里的变量x。它代表一种“暂时不确定的类型”

  • 普通变量const a = 1a的值是可以变的。

  • 泛型变量<T>T代表的类型是可以变的。


二、 为什么要用它?(痛点分析)

假设你是一个包装盒工厂的老板,你需要用代码描述你的产品。

1. 如果不用泛型(死板的写法)

你需要为每一种产品都写一个定义,非常累:

// 玩具盒 interface ToyBox { content: Toy; } ​ // 鞋子盒 interface ShoeBox { content: Shoe; } ​ // 书籍盒 interface BookBox { content: Book; }

缺点:代码重复,逻辑一样,只是里面装的东西不一样。

2. 如果用泛型(灵活的写法)

你只需要写一个“万能盒子”的定义:

// 定义一个万能盒,里面装什么暂时不管,先用 T 占位 interface Box { content: T; } 当你需要具体使用时,再告诉它装什么: // 这是一个玩具盒,T 变成了 Toy const toyBox: Box<Toy> = { content: myToy }; ​ // 这是一个鞋子盒,T 变成了 Shoe const shoeBox: Box<Shoe> = { content: myShoe };

优点:一套代码,复用无限次。


三、 它是怎么工作的?

回到文章开头的例子:

interface PageResult { list: T[]; total: number; }

这里的<T>就像是一个“广播”

  1. 定义时T只是一个符号,代表“某种类型”。

  2. 使用时:当你写PageResult<User>,你相当于按下了开关:

    • 接口里所有的T,瞬间全部变成了User

    • list的类型变成了User[]

    • 如果接口里还有其他地方用了T(比如currentItem: T),那它也会变成User

这保证了整个对象内部数据类型的一致性。


四、 什么时候需要写尖括号<...>

这是最容易混淆的地方,记住这两个原则:

1. 定义时:不需要写具体类型

你在定义接口或函数时,只需要声明“这里有个坑”,不需要填坑。

// ✅ 正确:定义一个泛型接口 interface Data { value: T } ​ // ❌ 错误:定义时不能指定具体类型 interface Data { value: string }

2. 使用时:必须填坑

当你把这个接口当做类型来用的时候,必须告诉它T到底是什么。

// ✅ 正确:使用时指定 T 为 number const numData: Data<number> = { value: 100 } ​ // ✅ 正确:使用时指定 T 为 string const strData: Data<string> = { value: "hello" } ​ // ❌ 错误:使用时不指定具体类型(某些严格模式下会报错) const data: Data = { value: 100 }

五、 总结

  • <T>是什么?:是一个类型占位符,代表“暂时未知的类型”。

  • 有什么用?:让代码更灵活,不用为每种数据类型都写一遍重复的逻辑。

  • 怎么用?

    • 定义时:写<T>,留个坑。

    • 用时:写<具体类型>,把坑填上。

http://www.jsqmd.com/news/477455/

相关文章:

  • OpenClaw Channel 对接飞书:从零到一实现企业级 AI 助理
  • 使用 storcli 将 LSI RAID 硬盘从 JBOD 模式改为 RAID 模式
  • 杭州宙宇未来科学技术有限公司靠谱吗?从官方资质看企业实力 - 资讯焦点
  • OpenClaw简介
  • 生成式AI教育公平的五大现实障碍
  • Human IgE His-Tagged Protein:从过敏介质到肿瘤免疫治疗的创新突破
  • 查出5级组织树结构
  • iOS 解决 4.3a【二进制加固】
  • 国产数据库选型实战:MySQL迁移的兼容性、安全与性能落地
  • 使用AsyncOpenAI通过LLM Proxy网关异步调用多种大模型的实践指南
  • 2026年公众号SVG互动排版指南 3款微信编辑器权威测评 - 资讯焦点
  • linux内核高端内存映射-kmap/kunmap
  • 毕业设计实战:基于Spring Boot的家电销售展示平台设计与实现全攻略
  • influxdb(时序数据库)+mqtt(emqx+mqtt客户端)
  • 基于Matlab的数字信号处理音频FIR去噪滤波器探索
  • PowerShell 设置默认读取某个文件夹
  • 计算质谱的进展、挑战与展望
  • 聊聊2026年口碑好的集装袋正规供应商,哪家性价比高 - 工业品网
  • 2026年婚礼邀请函制作复盘:从关键词搜索到版式细节调整
  • 2026年阀门选择,闸阀vs截止阀
  • 5分钟学会!把代码从本地推送到 GitHub,就是这么简单
  • 实战案例十三:HR 招聘自动化 - 简历筛选与面试辅助
  • Unity3d实时读取Modbus RTU数据
  • day112(3.14)——leetcode面试经典150
  • 苹果 MacBook Neo:低价入局,模块化维修开启新战局
  • 2026宝宝辅食锅煮粥哪个牌子好?宝妈实测推荐 - 品牌排行榜
  • 收藏备用|2026年大模型+AI深度影响的专业汇总,程序员/小白入门必看
  • 长沙心理医院就诊指南:真实案例分享与暖心复盘
  • GEO源码搭建从零到一实战教程 完整部署流程与避坑指南全解析
  • 【经验分享】2026年了,国内开发者如何稳定、低成本地维持 ChatGPT Plus 生产力?