TypeScript 03:泛型与工具类型

TypeScript泛型深入讲解 typescript教程 阅读详情

TypeScript 03:泛型与工具类型

有 JS 基础即可阅读。建议先读第 01、02 课。

1. 先看问题:逻辑一样,类型不同

function wrapStr(v: string): string[] {
  return [v]
}
function wrapNum(v: number): number[] {
  return [v]
}
// 逻辑一字不差,只有「类型」不同 → 只能复制粘贴

想复用,通常的歪路是 any——能复用,但检查全丢:

function wrapAny(v: any): any[] {
  return [v]
}
const n = wrapAny(42)
n.push('oops') // ✅ 编译通过,运行时数组混进了字符串

2. 泛型:把「类型」也变成参数

函数参数传的是值,泛型传的是类型。T 是类型的占位符,调用时才被填上:

//        类型的参数   值的参数
function wrap<T>(v: T): T[] {
  return [v]
}

wrap('hi') // ① 'hi' 是 string → ② 函数里所有 T 替换成 string
wrap(42) // T 替换成 number

心智模型一句话:

函数只有一份,类型是每次调用时「现印」的——把 TS 想成复印机。
wrap('hi') 印出 string[] 版,wrap(42) 印出 number[] 版。

所以泛型 = 复用 + 精确两全:逻辑写一遍,每次调用类型各自精确。

3. 关键澄清:T 只在「定义处」存在

初学最常见的误解是以为返回值「还是泛型」——不,每个返回值拿到的是印好的具体版本:

const a = wrap('hi') // a 是 string[],T 已经变成了 string
a.push(1) // ❌ Argument of type 'number' is not assignable to parameter of type 'string'

4. 你早就在用泛型,只是没人说破

const x: string[] = []
const y: Array<string> = [] // 完全等价![] 是简写,尖括号里就是那个 T

Array<string> 读作「一个数组,元素类型用的时候才给」。Vue 的 Ref<number>、各种库源码里的 <T>,全是同一台复印机。

5. 泛型接口

interface Box<T> {
  value: T
}

const b1: Box<number> = { value: 42 }
const b2: Box<string> = { value: 'abc' }

6. 约束 extends:给 T 设「准入条件」

泛型把「传什么类型」的权利交给了调用方——对方可能传任何东西进来。想在函数体里用 x.length,就得提前提条件:

function getLength<T extends { length: number }>(x: T): number {
  return x.length // 没有这行 extends,TS 不敢保证 T 有 length
}

getLength('hello') // ✅ string 有 length
getLength([1, 2, 3]) // ✅
getLength(123) // ❌ Type 'number' does not satisfy the constraint '{ length: number }'

7. 进阶:keyof 与工具类型(初学可先跳过,用到再回来看)

keyof:拿到「字段名的联合类型」;T['字段']:从类型上取出字段的类型。

interface User {
  name: string
  age: number
}

type UserKeys = keyof User // 'name' | 'age'
type AgeType = User['age'] // number

工具类型 = 内置的「类型函数」:接收一个类型,加工后返回新类型。

interface User {
  name: string
  age: number
  email: string
}

Partial<User> // 全部变可选 → 典型场景:局部更新(patch 只传要改的字段)
Required<User> // 全部变必填
Pick<User, 'name' | 'age'> // 只挑这几个字段 → 接口瘦身
Omit<User, 'email'> // 排除字段
Record<'host' | 'port', number> // { host: number; port: number } → 字典 / 配置

面纱:工具类型没有魔法,就是「泛型 + 遍历字段」:

type MyPartial<T> = {
  [K in keyof T]?: T[K] // 遍历 T 的每个字段 K,把类型 T[K] 变为可选
}

从函数提取类型(类型世界的 typeof 拿「类型形状」,和运行时 typeof 同名不同物):

function createUser() {
  return { name: 'Tom', age: 18 }
}

type NewUser = ReturnType<typeof createUser> // { name: string; age: number }

8. 高频报错速查

报错人话
Argument of type 'number' is not assignable to parameter of type 'string'泛型 T 已推断锁定,不能再塞别的类型
Type 'number' does not satisfy the constraint '{ length: number }'T 不满足 extends 约束
Type '"email"' is not assignable to type 'keyof User'取了不存在的字段名
Property 'port' is missing in type ...Record 声明的键必须一个不少
【低照度图像增强系列】使用MSRCR(Multi-Scale Retinex with Color Restoration)算法对低照度图像进行增强处理 阅读详情

相关推荐

Cadence Allegro 17.2 PCB设计避坑指南:从焊盘制作到封装绘制的完整流程

本文详细解析了Cadence Allegro 17.2在PCB设计中的关键操作技巧,从焊盘制作到封装绘制的完整流程。通过0402电阻和2.54mm排针的实例,揭示新手常见错误及解决方案,包括焊盘参数设置、层类型区分和坐标输入规范,帮助工程师避免设计返工和生产事故。

weixin_28683391的博客 409

一文搞懂TypeScript泛型,让你的组件复用性大幅提升

泛型是一个强大的工具,可以帮助我们创建可复用的函数。在TypeScript中,我们可以声明变量和其他数据结构为特定类型,例如对象、布尔值或字符串类型。而通过使用泛型,我们可以处理传递给函数的多种类型的变量。在这篇文章中,我们将学习如何通过泛型实现类型安全,同时不牺牲性能或效率。泛型允许我们在尖括号中定义一个类型参数,如。此外,它们还允许我们编写泛型类、方法和函数。我们将深入探讨在TypeScrip...

前端达人 1230

ABAP调用启信宝API

方法参数定义如下 源代码如下 method qxb_http_get. data:lv_url type string. "===============初始化=============================================== "获取http实例 cl_http_client=>create_by_destination( exporting destination = space importing

u012232542的博客 1312

深入理解 TypeScript 的类型系统:接口、枚举与泛型

接口的定义非常简单,你可以为对象定义属性类型,甚至可以为函数定义参数和返回值类型。// 定义一个接口,表示一个用户对象// 使用接口age: 30,greet() {${this// 定义一个接口,表示一个用户对象 interface User {} // 使用接口 const user : User = {} };// 输出:Hello, my name is Alice// 输出:Hello, my name is Alice枚举值可以是字符串或数字。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 1069

深度强化学习算法PPO训练Pendulum

returnadv = 0print('状态空间维度:', state_n)print('动作空间维度:', action_n)steps = []if done:breakif done:breakelse:steps = []if done:break。

weixin_43336108的博客 808

北斗三号PPP-B2b信号实战指南:从接收机配置到精度验证全流程

本文提供了北斗三号PPP-B2b信号从硬件配置到数据处理的全流程实战指南。详细解析了信号特性、接收机关键参数设置,并以飞纳接收机和Mass软件为例,演示了数据解算与精度验证方法。通过覆盖中国多地区的联调测试案例,验证了PPP-B2b服务可实现分米级实时定位精度,为无网络地区高精度应用提供了可靠解决方案。

nn3456的博客 554

TypeScript 泛型:编写可复用代码的利器

本文将介绍 TypeScript 中的泛型概念,探讨其在代码中的作用和优势,帮助开发者更好地利用 TypeScript 进行前端开发。在 TypeScript 中,泛型是一种编程范式,它允许开发者定义一个可以接受多种类型参数的函数、类或接口。泛型可以提高代码的复用性和可维护性,同时保持类型安全。TypeScript 中的泛型是静态类型检查的一个重要组成部分,它可以帮助开发者编写可复用和可扩展的代码,同时保持类型安全。通过合理使用泛型,我们可以构建更加健壮和可维护的前端应用。

你若盛开,清风自来 1103

AI编码规则:从提示工程到自动化,提升大模型生成代码质量

在软件工程领域,代码质量是保障软件可维护性、安全性和团队协作效率的核心。其背后遵循着从基础语法规范到架构设计原则的一系列工程实践。随着大语言模型(LLM)在代码生成任务中的广泛应用,如何确保AI生成的代码符合这些工程标准,成为一个关键的技术挑战。这涉及到将人类工程师积累的最佳实践,转化为机器可理解、可执行的明确约束。通过系统化的**编码规则**定义与集成,例如构建涵盖安全、风格、架构的多层次规则集,并将其融入**提示工程**或自动化工作流,可以显著引导AI产出更健壮、规范的代码。这种方法的价值在于,它能将模

weixin_42525189的博客 643

TypeScript 基础语法03:泛型

文章目录泛型基础示例使用泛型变量泛型类型泛型类泛型约束在泛型约束中使用类型参数 泛型 软件工程中,我们不仅要创建定义良好且一致的 API,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。 在像 C# 和 Java 这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。 基础示例 下面来创建第一个使用泛型的例子:identity 函数。 这个函数会返回任何传入它的

wj_love_wj的博客 521

5、硬件工程师笔试面试——上拉电阻、下拉电阻(2025版本)

本文系统介绍了上拉电阻和下拉电阻的原理与应用。上拉电阻通过连接电源确保电路高电平状态,常用于数字电路防抖、OC门驱动等场景;下拉电阻连接地线维持低电平,适用于低电平触发电路。文章详细分析了两种电阻的选择方法、功耗与响应速度的平衡策略,以及在高速信号传输中的影响差异。同时对比了二者的优缺点,并提供了模拟电路中的应用实例。最后给出了电阻值计算的工程方法,为硬件工程师的电路设计提供了实用参考。

XU157303764的博客 2872

★教程1:matlab学习教程入门100例目录

★基础入门 1.为什么要学习MATLAB 2.MATLAB安装 持续更新....... ★MATLAB基础编程语言熟悉

FPGA/MATLAB学习教程/源码/项目合作开发 4万+

【TS】TypeScript类型断言:掌握类型转换的艺术

类型断言是一种告诉编译器"相信我,我知道我在做什么"的方式。它类似于其他语言中的类型转换,但不进行特殊的数据检查和重构。类型断言纯粹是一个编译时语法,不会影响程序的运行时行为。

鑫宝的博客 4755

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

TypeScript学习笔记(七) 泛型

大家好,我是半虹,这篇文章来讲 TypeScript 中的泛型

半虹小站 859

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

TypeScript 学习笔记(二)- 泛型

泛型(Generics)是允许同一个函数接受不同类型参数的一种模板。相比于使用 any 类型,使用泛型来创建可复用的组件要更好,因为泛型会保留参数类型。

kelly0721的博客 873

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

TypeScript:熟练掌握TypeScript

TypeScript核心概念与优势摘要 TypeScript是JavaScript的超集,扩展了JS的静态类型系统,主要优势包括: 静态类型检查:编译阶段即可发现类型错误,避免运行时异常 增强开发体验:完善的代码提示和自动补全功能 面向对象支持:完整支持类、接口、泛型等特性 渐进式采用:兼容现有JS代码,可逐步迁移 框架友好:Vue3/Angular/React等主流框架深度集成 核心特性: 类型注解与接口定义 联合类型与类型别名 泛型编程支持 枚举与元组类型 类修饰符(public/private等) 适

snow的博客 9529

03-TypeScript 高级类型

(Type 类型的数组),因为只要是数组就一定存在 length 属性,因此就可以访问了。同样,如果传入类型 string,函数 id 参数和返回值的类型就都是 string。绝大多数情况下,我们都可以在使用对象前就确定对象的结构,并为对象添加准确的类型。这样,通过泛型就做到了让 id 函数与多种不同的类型一起工作,(或者说对象中可以出现任意多个属性),此时,就用到。K:是对象类型名称,T:是剔除K类型中的属性名称。(比如,第二个类型变量受第一个类型变量约束)泛型的类型变量可以有多个,并且。

m0_67520560的博客 238

TypeScript Workshop中的接口与泛型:提升代码复用性的关键技术

TypeScript Workshop是学习TypeScript的完整实践项目,其中接口与泛型是提升代码复用性的核心技术。本文将深入解析这两项技术在实际开发中的应用,帮助开发者编写更健壮、灵活的代码。 ## 接口:定义清晰的数据契约 📝 接口是TypeScript中定义数据结构的强大工具,它能够为代码提供清晰的契约,确保数据的一致性和可预测性。在TypeScript Workshop的[02

gitblog_00131的博客 219

【TS】TypeScript函数类型:提升函数的类型安全性和可读性

在JavaScript中,函数是一等公民,它们可以被赋值给变量、作为参数传递,甚至作为其他函数的返回值。TypeScript作为JavaScript的超集,不仅继承了这些特性,还为函数添加了强大的类型系统支持。本文将深入探讨TypeScript中的函数类型,包括其定义、使用方法以及高级特性,帮助您更好地在TypeScript项目中使用函数,提高代码的类型安全性和可读性。

鑫宝的博客 2113

【前端】你好,我叫TypeScript 03──数据类型

泛型 写在前面 今天是520,祝大家有情人终成眷属吧​,咱们也应应景​,解锁两个新英雄:蹦蹦和跳跳,探索以全新的问答视角来介绍和解决亟需处理的问题。 什么是泛型? 蹦蹦:跳跳,你晓得啥子是泛型嘛? 跳跳:在历史中,强者高手都是考虑现在和未来的,只有宏观把握才能让自己立于不败之地。就像你耍游戏撒,不管你要出啥子大件装备,你先买一双孩子或者多兰剑、蓝色戒指你就不会错撒,反正都是要在这个方面拓展。 而在面向对象的编程语言中,组件不仅要考虑到现在的数据类型,还要考虑到未来要使用的数据类型,而泛型完美的提供了组件的可

qq_36789311的博客 381

鸿蒙 HarmonyOS 6 | 逻辑核心 (03):网络通信——Axios 封装、拦截器设计与泛型接口处理

在企业级的应用架构中,我们需要构建一道坚固的网络通信防线:我们需要一个统一的入口来管理超时和 BaseURL,需要一对敏锐的拦截器来自动注入 Token 和处理全局异常,更需要利用 TypeScript 强大的泛型系统来确保每一条回来的数据都是类型安全的。

Code Metaverse 2690

typeScript-03接口与泛型

接口 接口既可以在面向对象编程中表示为行为的抽象,也可以用来描述对象的形状 我们用 interface 关键字来定义接口 在接口中可以用分号或者逗号分割每一项,也可以什么都不加 定义的变量比接口少了一些属性是不允许的,多一些属性也是不允许的。 赋值的时候,变量的形状必须和接口的形状保持一致 接口一般首字母大写。有的编程语言中会建议接口的名称加上 I 前缀。 //接口可以用来描述`对象的形状` interface Speakable { speak(): void; readonly lng: s

w_cyj的博客 415

TypeScript 中定义和处理类型的方式总结

使用interface定义对象的结构,指定属性及其类型。isEmployed?: boolean;// 可选属性可以使用type来定义基本类型,也可以定义联合类型和元组类型。// 联合类型使用type定义对象的结构,指定属性及其类型。isEmployed?: boolean;// 可选属性在处理配置文件或静态数据时。它为数据结构提供了清晰的界定,并提高了代码的类型安全性和可维护性。

weixin_44745053的博客 1169

Hello Typescript(08)-- 泛型

背景:实现一个打印函数 function log(value: string): string { console.log(value); return value; } 需求+1:函数也要可以接受字符串数组 这里我们可能想到了用函数重载。 function log(value: string): string; function log(value: string[]): string[]; function log(value: any): any { console.log(valu

iamxuqianqian的博客 197

TS03 TypeScript进阶

TypeScript进阶

多啦的博客 723

TypeScript中的数组类型

📌如果一开始是any类型,那么你后续往里推什么,就是什么类型但是,类型推断的自动更新只发生初始值为空数组的情况。实际上,TypeScript 提供了两个专门的泛型,用来生成只读数组的类型。原因就是只读数组是数组的父类型,父类型不能替代子类型。命令声明的数组的成员是允许的。但是,很多时候确实有声明为只读数组的需求,即不允许变动数组成员。由于只读数组是数组的父类型,所以它不能代替数组。我们知道,子类型继承了父类型的所有特征,并加上了自己的特征,所以子类型。

weixin_45134711的博客 955

03.TypeScript 常见泛型工具详解

TypeScript 内置了多种实用的泛型工具类型,可以简化类型操作。Partial<T> 将属性变为可选,Required<T> 使属性必填,Readonly<T> 设置为只读。Record<K,T> 创建键值映射,Pick<T,K> 选择特定属性,Omit<T,K> 排除属性。Exclude<T,U> 移除类型,Extract<T,U> 提取类型,NonNullable<T> 排除 null/un

止于至善 575
上一篇: TypeScript 02:interface、type 与类型收窄
下一篇: TypeScript 04:类型断言与类型守卫
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值