news 2026/4/28 2:55:40

TypeScript进阶学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TypeScript进阶学习

TypeScript进阶学习:

从类型系统到高级类型守卫

前言

TypeScript作为JavaScript的超集,其强大的类型系统为前端开发带来了前所未有的代码健壮性和可维护性。本文将从基础类型出发,逐步深入到高级类型、泛型、类型守卫等进阶概念,帮助您全面掌握TypeScript的核心特性。

一、基础类型回顾

TypeScript继承了JavaScript的基础类型,并在此基础上增加了类型注解。

letdecimal:number=6;lethex:number=0xf00d;letu:undefined=undefined;letn:null=null;

1.1 Any与Unknown

  • Any:放弃类型检查,可以赋任意值
  • Unknown:Any的安全替代品,只能赋值给any或unknown类型
letnotSure:any=4;notSure="maybe a string instead";letvalue:unknown;value=true;// let other: string = value; // 错误,unknown不能直接赋值给其他类型

1.2 Never类型

表示永不存在的值的类型,通常用于抛出异常或无限循环的函数。

functionerror(message:string):never{thrownewError(message);}

二、高级类型工具

2.1 元组(Tuple)

固定元素数量和类型的数组。

letx:[string,number];x=["hello",10];

2.2 枚举(Enum)

一组有名字的常量集合。

enumColor{Red,Green,Blue}letc:Color=Color.Green;

2.3 联合类型与交叉类型

  • 联合类型(|):表示值可以是多种类型之一
  • 交叉类型(&):合并多个类型
letvariable:string|number;typeCombined=Part1&Part2;letobj:Combined={a:'hello',b:2};

三、函数进阶

3.1 函数类型注解

functionadd(x:number,y:number):number{returnx+y;}letmyAdd:(x:number,y:number)=>number=function(x,y){returnx+y;};

3.2 可选参数、默认参数与剩余参数

// 可选参数使用?functionbuildName(firstName:string,lastName?:string){...}// 剩余参数使用...functionbuildRestName(firstName:string,...restOfName:string[]){...}

3.3 函数重载

同一个函数根据参数类型不同返回不同类型。

functionreverse(x:number):number;functionreverse(x:string):string;functionreverse(x:number|string):number|string{// 实现}

四、接口与类

接口用于定义对象的结构,描述对象、函数或类的公共部分。

interfaceLabelValue{label:string;}interfaceSearchFunction{(source:string,subString:string):boolean;}

五、泛型(Generics)

泛型让组件可以支持多种数据类型,同时保持类型安全。

5.1 函数泛型

functionidentity<T>(arg:T):T{returnarg;}letresult=identity<number>(42);

5.2 接口泛型

interfacePair<T,U>{first:T;second:U;}

5.3 类泛型

classContainer<T>{value:T;constructor(value:T){this.value=value;}getValue():T{returnthis.value;}}

六、内置高级类型

6.1 keyof

获取类型的所有键名。

typeUserKeys=keyofUser;// "name" | "age" | "email"

6.2 Readonly

将所有属性变为只读。

typeReadonlyPerson=Readonly<Person>;// person.name = "Tom"; // 错误,只读属性不可修改

6.3 Partial

将所有属性变为可选。

typePartialPerson=Partial<Person>;constperson:PartialPerson={name:"Tom"};// age可选

6.4 Pick

从类型中选择部分属性。

typePersonInfo=Pick<Person,"name"|"age">;

6.5 Record

创建键值对映射类型。

typeSchedule=Record<WeekDays,string>;

七、类型守卫(Type Guards)

类型守卫用于在运行时收窄类型范围,提高类型安全性。

7.1 typeof守卫

functionprintValue(value:string|number){if(typeofvalue==="string"){console.log(value.toUpperCase());}else{console.log(value.toFixed(2));}}

7.2 instanceof守卫

if(animalinstanceofDog){animal.woof(5);// 此处animal被收窄为Dog类型}

7.3 自定义谓词函数

使用value is Type语法创建自定义类型守卫。

functionisCircle(shape:Shape):shapeisCircle{returnshape.kind==='circle';}

7.4 可区分联合(Discriminated Union)

通过共有属性(如type)来区分联合类型中的不同成员。

switch(vehicle.type){case'car':// vehicle被收窄为Car类型break;case'bicycle':// vehicle被收窄为Bicycle类型break;}

7.5 in操作符守卫

检查对象是否包含某个属性。

if("brand"invehicle){console.log(vehicle.brand);// vehicle被收窄为Car类型}

八、最佳实践建议

  1. 优先使用unknown而非any:unknown强制类型检查,更安全
  2. 充分利用可区分联合:使复杂状态管理更清晰
  3. 善用内置工具类型:Readonly、Partial、Pick、Record等减少重复代码
  4. 类型守卫优化代码逻辑:在复杂分支中自动收窄类型
  5. 避免过度使用any:会失去TypeScript的类型保护优势

总结

TypeScript提供了从基础类型到高级泛型、类型守卫等一整套强大的类型系统。掌握这些特性不仅能写出更健壮的代码,还能通过IDE提供更好的开发体验。本文涵盖的知识点是TypeScript进阶学习的核心,希望对您的TypeScript实践有所帮助。


参考资料:TypeScript官方文档


博客分类:TypeScript、前端开发

标签:#TypeScript #类型系统 #泛型 #类型守卫 #前端进阶

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 2:51:20

电磁干扰攻击原理与硬件安全防护实践

1. 电磁干扰攻击&#xff1a;硬件安全领域的隐形杀手十年前我刚入行硬件安全时&#xff0c;电磁兼容性&#xff08;EMMC&#xff09;还只是工程师们为了通过产品认证才关注的技术指标。直到2016年DEF CON大会上那场震惊业界的自动驾驶传感器干扰演示&#xff0c;我们才真正意识…

作者头像 李华
网站建设 2026/4/28 2:37:32

在PC上体验Switch游戏:Ryujinx模拟器的完整入门指南

在PC上体验Switch游戏&#xff1a;Ryujinx模拟器的完整入门指南 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 你是否曾梦想在电脑上畅玩任天堂Switch的独占游戏&#xff1f;Ryujinx模…

作者头像 李华
网站建设 2026/4/28 2:36:23

微服务下 DTO 设计核心原则

文章目录前言一、微服务调用链二、推荐命名请求对象三、Feign 接口示例stock-api 模块请求 DTO返回 DTO四、微服务 DTO 不要放在哪&#xff1f;五、不要直接暴露 Entity / DO六、DTO 要分“入参”和“出参”七、统一返回结构八、版本兼容很重要九、订单服务调用用户服务示例十、…

作者头像 李华
网站建设 2026/4/28 2:28:21

AKS+OpenAI+Terraform:云原生AI应用基础设施一键部署实践

1. 项目概述&#xff1a;当Kubernetes遇见大语言模型最近在搞一个内部AI应用的原型&#xff0c;需要快速在云上部署一个能跑大语言模型推理的服务。需求很明确&#xff1a;要能弹性伸缩、要能方便地管理模型版本、还要能跟现有的Kubernetes生态无缝集成。在Azure上转了一圈&…

作者头像 李华