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

你的JS代码总在半夜崩溃?TypeScript来“上保险”了

你有没有经历过:凌晨三点,线上报“Cannot read property ‘name’ of undefined”,你爬起来一看,原来是后端返回的数据少了一层。如果JS有“类型检查”,这种悲剧根本不会发生。今天我们就来认识TypeScript——给JavaScript买了一份“意外险”。

前言

JavaScript就像个自由散漫的天才:你给它一个字符串,它当数字用;你忘记传参数,它给你个undefined;你访问对象不存在的属性,它笑眯眯地说“没事,我给你undefined”。这种灵活在小型项目里很爽,但项目一大,就成了噩梦。

TypeScript(简称TS)就是来解决这个问题的。它给JS加上了类型系统,在代码运行之前就帮你检查类型错误。就像给代码装了安检门,不规范的写法根本过不去。

一、TypeScript是啥?JS的“严格模式”Pro Max

TypeScript是微软开发的开源语言,它是JavaScript的超集。意思是:所有合法的JS代码,在TS里也合法。TS只是给JS加了类型注解和一些新特性,然后编译成干净的JS。

// JS写法functiongreet(name){return'Hello, '+name;}// TS写法(加了类型)functiongreet(name:string):string{return'Hello, '+name;}greet(123);// ❌ 报错:参数不能是数字

你看,TS在编译阶段就抓住了错误,不用等到运行时。

二、为什么要用TS?三个字:稳、爽、香

  • :类型错误在写代码时就暴露,而不是在用户手里炸。
  • :编辑器智能提示飞起,不用记方法名、参数顺序。
  • :代码即文档,看函数签名就知道怎么用。

据统计,使用TS的项目,早期Bug能减少15%~25%。对于中大型项目,TS几乎是标配。

三、基础类型:TS的“基本词汇”

TS支持JS的所有类型,还加了一些新的。

1. 原始类型

letname:string='张三';letage:number=18;letisStudent:boolean=true;letnothing:null=null;letnotDefined:undefined=undefined;letbig:bigint=100n;letsym:symbol=Symbol('id');

2. 数组

letlist1:number[]=[1,2,3];letlist2:Array<string>=['a','b'];// 泛型写法

3. 元组(固定长度和类型的数组)

letperson:[string,number]=['张三',18];person[0]='李四';// OKperson[1]='20';// ❌ 报错,第二个元素必须是数字

4. 枚举(给一组数字起名字)

enumColor{Red,Green,Blue}letc:Color=Color.Red;console.log(c);// 0(默认从0开始)// 自定义值enumStatus{Success=200,NotFound=404}

5. Any(万能类型,慎用)

letnotSure:any=4;notSure='字符串';// OKnotSure=true;// OK

any会关闭类型检查,相当于回到JS。尽量少用,除非你确定这个值无法预知类型。

6. Unknown(安全的Any)

letvalue:unknown='hello';value=123;// OK// console.log(value.toUpperCase()); // ❌ 报错,unknown不能直接调用方法if(typeofvalue==='string'){console.log(value.toUpperCase());// 类型收窄后可用}

unknownany安全,因为使用前必须先判断类型。

7. Void(没有返回值)

functionwarnUser():void{console.log('警告');}// 变量声明为void类型只能赋值为null或undefined(strict模式下只能undefined)

8. Never(永远不会发生的类型)

functionerror(message:string):never{thrownewError(message);}functioninfiniteLoop():never{while(true){}}

四、类型注解:给变量贴标签

TS的核心就是类型注解:在变量、函数参数、返回值后面加上: 类型

letmyName:string='张三';functionadd(a:number,b:number):number{returna+b;}

但TS很智能,很多时候可以类型推断,不用显式写:

letage=18;// TS自动推断为numberage='18';// ❌ 报错

五、接口(Interface):定义对象的形状

接口是TS里最常用的功能,用来描述对象的结构。

interfacePerson{name:string;age:number;email?:string;// 可选属性readonlyid:number;// 只读属性}constzhangsan:Person={name:'张三',age:18,id:1};zhangsan.id=2;// ❌ 报错,只读属性不能改

接口还可以描述函数类型:

interfaceAddFunc{(a:number,b:number):number;}constadd:AddFunc=(x,y)=>x+y;

六、类型别名(Type):给类型起外号

类型别名和接口很像,但能表示联合类型、元组等更复杂的类型。

typeID=string|number;// 联合类型typePoint=[number,number];// 元组typeCallback=(data:string)=>void;letuserId:ID=123;userId='abc';

接口 vs 类型别名

  • 接口可以扩展(extends),类型别名用交叉(&)。
  • 接口可以重复定义自动合并,类型别名不能重复。
  • 推荐优先用接口描述对象,用类型别名描述联合、元组等。

七、实战:用TS写一个简单的函数

// 需求:格式化用户信息interfaceUser{name:string;age:number;address?:string;}functionformatUser(user:User,withAddress:boolean=false):string{letbase=`${user.name},${user.age}`;if(withAddress&&user.address){base+=`, 地址:${user.address}`;}returnbase;}constu:User={name:'李四',age:20,address:'北京'};console.log(formatUser(u,true));// "李四, 20岁, 地址:北京"

如果你在编辑器里打formatUser(,它会提示参数类型和返回值类型,爽不爽?

八、常见坑点与建议

  1. 不要滥用any:any越多,TS的价值越低。实在不知道类型,先写unknown
  2. 严格模式:开启strict: true(tsconfig.json),让TS更严格地检查。
  3. 第三方库:大多数库都有@types/xxx类型定义,安装后就能获得智能提示。
  4. 编译后的JS:TS只负责编译时检查,运行时还是JS,类型信息会被擦除。

九、总结:TS不是敌人,是保镖

  • 给JS加上类型,提前发现错误。
  • 基础类型、接口、类型别名是核心工具。
  • 用好类型推断,少写冗余注解。
  • 逐步迁移老项目,从.js改成.ts,开启allowJs: true

学TS并不难,你只需要把“写JS时的心理预期”明确写出来。明天我们继续深入TypeScript,聊聊高级类型——泛型、联合类型、交叉类型、类型保护,让你写出更灵活更安全的代码。

如果你觉得今天的“保险课”够实在,点个赞让更多人看到。我们明天见!

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

相关文章:

  • OpenClaw跨平台控制:Qwen3-14B管理多台设备的自动化流
  • mysql如何审计误删除数据操作_mysql binlog逆向分析追踪
  • 理查森外推法详解:从数学原理到Python实现(保姆级教程)
  • 【声纳与人工智能融合——从理论前沿到自主系统实战(进阶篇)】第十八章 海底底质智能反演的多分支物理先验网络
  • 进口两级压缩技术赋能工业节能:昆西的全球化实践与洞察
  • 【教学类-160-01】20260408 AI视频培训-练习1“豆包AI视频”
  • Obsidian 零基础入门教程
  • AUTOSAR兼容性验证失败?车载C#中控系统代码合规性自查清单,含ISO 26262 ASIL-B级代码审计模板
  • 为什么你的.NET 9容器镜像比别人胖47%?——官方SDK分层优化与多阶段构建深度拆解(实测数据支撑)
  • 手把手教你用Cherry Studio+蓝耘API,5分钟把Qwen3-VL-32B变成你的私人图表分析助手
  • 数字信号完整性分析:眼图原理与应用详解
  • 从安装到验证:一步步教你如何在Ubuntu上使用apt-get安装gfortran-6
  • OpenClaw+千问3.5-9B:自动化测试脚本生成与执行
  • 2026年比较好的富氢水机源头工厂推荐 - 行业平台推荐
  • 从“手脚”到“脑回路”:MCP + Skills 如何让AI Agent真正成年
  • 代码生成利器:OpenClaw调用Qwen3.5-9B自动化开发脚本
  • 【声纳与人工智能融合——从理论前沿到自主系统实战(进阶篇)】第二十章 可解释性人工智能(XAI)的高阶前沿
  • 为什么你的EventHandler仍触发装箱?C# 13 `ref delegate`与`unmanaged`委托语法(仅限.NET 8.0.3+ RTM)
  • OCServo库详解:ROBS伺服电机的嵌入式RS485闭环控制方案
  • 拆穿名词诈骗!用大白话理解晦涩难懂的AI概念寥
  • IC617 Virtuoso版图设计实战:从零构建Schematic Cellview的完整流程
  • PMOS双电源切换电路设计:USB充电与电池供电的无缝隔离
  • Budibase实战:5分钟搞定PostgreSQL车辆管理系统(附完整SQL脚本)
  • 免费功能强大的大屏开发平台
  • migrate_disable_switch及cpus_ptr、user_cpus_ptr的相关细节
  • 深入解析vEPC MANO架构:虚拟核心网的生命周期管理
  • 孤能子视角:Kimi自我分析诊断[2],静态同构分析
  • 从耳膜振动到大脑解码:用Python模拟声音感知的物理与心理过程
  • OpenClaw效率提升报告:Qwen3.5-9B自动化处理图片任务的耗时分析
  • 紧急预警:2025年起欧盟UNECE R155强制要求车载C#代码具备可追溯性!3天内完成全链路TraceID植入的终极脚手架