TS 基础扫盲:类型・接口・类型别名实战|Vue TS 落地篇
同学们好我是 Eugene尤金一个拥有多年中后台开发经验的前端工程师~Eugene 发音很简单/juːˈdʒiːn/大家怎么顺口怎么叫就好你是否也有过明明学过很多技术一到关键时候却讲不出来、甚至写不出来你是否也曾怀疑自己是不是太笨了明明感觉会却总差一口气就算想沉下心从头梳理可工作那么忙回家还要陪伴家人。一天只有24小时时间永远不够用常常感到力不从心。技术行业本就是逆水行舟不进则退。如果你也有同样的困扰别慌。从现在开始跟着我一起心态归零利用碎片时间来一次彻彻底底的基础扫盲。这一次我们一起慢慢来扎扎实实变强。不搞花里胡哨的理论堆砌只分享看得懂、用得上的前端干货咱们一起稳步积累真正摆脱“面向搜索引擎写代码”的尴尬。一、开篇为什么要关心 TS 类型日常业务里经常会遇到类型报错Object is possibly undefined、Type string is not assignable to type number不知道选什么any、unknown、interface、type什么时候用写了很多 TS 却像在写 JS到处用any类型形同虚设TypeScript 的核心是「类型约束」把很多问题在编译期暴露出来。但很多人要么写太多类型最后变玄学要么只会any形同 JS。这篇文章不讲特别深的底层原理而是围绕平时写业务时该怎么选、为什么这么选、容易踩哪些坑。从基础类型 → 接口 → 类型别名 → 实战选型 → 踩坑一次性理清。二、基础类型扫盲先把日常最常用的 5 个类型搞清楚。类型含义典型用途string字符串文案、id、枚举值number数字含整数、浮点、NaN数量、金额、分页boolean布尔开关、状态any任意类型不做检查兼容老代码、临时兜底unknown任意类型但必须先检查再用比 any 更安全的兜底2.1 string / number / boolean这三个是基础原始类型和 JS 里的用法一致只是加了一层类型标注// 变量声明时标注类型constname:string张三;constage:number25;constisActive:booleantrue;// 函数参数和返回值functiongreet(name:string):string{return你好${name};}functionadd(a:number,b:number):number{returnab;}业务里怎么用接口返回值、表单字段、状态开关优先用这三个而不是any。2.2 any最自由也最危险any表示「任意类型」TS 不再做类型检查。letdata:anyhello;data123;// OKdata{a:1};// OKdata.toUpperCase();// 编译通过但运行时报错data 实际是 object toUpperCase() 是 string 类型的方法object 上没有这个方法。问题any会关闭类型检查等于回到裸写 JS很容易在运行时才发现错误。适用场景临时接入老接口、第三方库还没时间写类型快速迁移 JS 项目到 TS 时的过渡已经用try-catch等做了安全兜底建议能不用就不用用的话尽量加注释说明原因。2.3 unknown比 any 更安全的兜底unknown也表示「任意类型」但使用时必须先「收窄」类型否则不能直接用。letdata:unknowngetFromApi();// 不知道接口返回什么// 直接调用会报错// data.toString(); // Error: data is of type unknown// 先判断类型再使用if(typeofdatastring){console.log(data.toUpperCase());// OK}elseif(typeofdataobjectdata!nullnameindata){console.log((dataas{name:string}).name);// 收窄后可安全使用}和 any 的对比特性anyunknown可直接调用方法✅❌ 必须先收窄可赋给任意类型✅❌类型安全无有需检查后才用建议拿不到确切类型时用unknown代替any通过typeof、in、类型守卫等方式收窄后再用。三、interface描述对象形状interface用来描述「对象长什么样」有哪些属性、什么类型、哪些可选。3.1 基本用法// 定义用户接口interfaceUser{id:number;name:string;age?:number;// 可选属性}// 使用constuser:User{id:1,name:张三// age 可省略};3.2 可选属性、只读属性interfaceConfig{readonlyapiUrl:string;// 只读不能改timeout?:number;// 可选}constconfig:Config{apiUrl:https://api.example.com};// config.apiUrl xxx; // Error: 只读3.3 继承interfaceBaseUser{id:number;name:string;}interfaceAdminUserextendsBaseUser{role:admin;permissions:string[];}constadmin:AdminUser{id:1,name:管理员,role:admin,permissions:[read,write]};3.4 索引签名动态属性// 属性名是 string值是 numberinterfaceStringMap{[key:string]:number;}constmap:StringMap{a:1,b:2};StringMap约束的是所有键key必须是字符串string所有值value必须是数字number业务场景后端返回的用户、列表项、配置对象等用interface描述结构最合适。四、type 类型别名给类型起个名字type用来给任意类型起别名可以是基础类型、对象、联合类型、函数等。4.1 基本用法// 基础类型别名typeUserIdnumber;typeUserNamestring;// 对象类型typeUser{id:UserId;name:UserName;};// 联合类型常见于业务typeStatuspending|success|error;typeThemelight|dark;4.2 联合类型、交叉类型// 联合A 或 BtypeResult{success:true;data:any}|{success:false;error:string};// 交叉A 且 B 的属性合并typeWithTimestampUser{createdAt:Date};4.3 函数类型typeOnChange(value:string)void;typeFetchUser(id:number)PromiseUser;//返回值必须是一个 Promise 对象且这个 Promise 最终成功解析resolve的值是 User 类型业务场景状态枚举、回调类型、联合类型等用type更合适。五、interface vs type怎么选这是问得最多的一个问题先看核心区别特性interfacetype声明合并✅ 同名可合并❌ 同名会报错继承extends交叉类型适用对象对象结构任意类型扩展对象容易容易联合/交叉不常用常用5.1 声明合并interface 独有// interface 同名会合并interfaceUser{name:string;}interfaceUser{age:number;}// 等价于 { name: string; age: number }// type 同名会报错typeUser{name:string};typeUser{age:number};// Error: 重复声明业务含义写插件、扩展第三方类型定义时用interface可以多次补充属性而type只能定义一次。5.2 选型建议用 interface描述对象结构用户、配置、接口返回值等有继承需求如extends BaseUser可能被第三方或插件扩展依赖声明合并用 type联合类型pending | success | error交叉类型User { role: string }函数类型(id: number) PromiseUser元组、复杂组合类型实践中对象结构优先interface其它复杂类型用type。两者都能描述对象时很多团队会统一用interface可读性更好。六、实战场景该怎么写6.1 接口返回值// 用 interface 描述interfaceUserListItem{id:number;name:string;avatar?:string;status:active|inactive;}interfaceApiResponseT{code:number;message:string;data:T;}// 使用asyncfunctionfetchUserList():PromiseApiResponseUserListItem[]{constresawaitaxios.get(/api/users);returnres.data;}代码中ApiResponseT的T是泛型的写法。如果有同学不了解泛型点击这里帮助同学们答疑解惑~6.2 表单、状态枚举// 用 type 做联合typeFormStatusdraft|submitting|success|error;typeSortOrderasc|desc;interfaceFilterState{status:FormStatus;sortBy:string;sortOrder:SortOrder;}6.3 事件回调typeOnSearch(keyword:string)void;typeOnPageChange(page:number,size:number)void;interfaceTableProps{onSearch:OnSearch;onPageChange:OnPageChange;}6.4 拿不准类型时用 unknownasyncfunctionfetchData(url:string):Promiseunknown{constresawaitfetch(url);returnres.json();}// 使用时必须收窄constdataawaitfetchData(/api/config);if(datatypeofdataobjectthemeindata){consttheme(dataas{theme:string}).theme;// 安全使用}七、踩坑指南坑原因建议到处用 any类型失效any 关闭类型检查尽量用 unknown或用具体类型Object is possibly undefined意思是你正在访问的对象可能是 undefined未定义可能为 undefined 却直接访问可选链obj?.prop、if判断、!断言interface 和 type 混用一团团队没约定对象用 interface联合/函数用 type对象字面量多了属性报错多余属性检查用变量接收再传入或加索引签名第三方库没有类型老库、非 TS 编写写.d.ts或ts-ignore标注原因7.1 多余属性检查interfaceUser{id:number;name:string;}// 直接传字面量时多了属性会报错// createUser({ id: 1, name: 张三, age: 18 }); // Error// 用变量接收再传则不会会按结构兼容constuser{id:1,name:张三,age:18};createUser(user);// OK7.2 类型断言要谨慎// as 断言你说它是什么TS 就信constdatagetData()asUser;// 若实际不是 User运行时可能崩// 更安全的做法用类型守卫functionisUser(obj:unknown):objisUser{returnobj!nulltypeofobjobjectidinobjnameinobj;}核心补充obj is User不是函数返回值函数实际返回布尔值只是给TS的提示当函数返回true时obj就是User类型。核心区分obj is User 是类型提示函数实际返回 true/false布尔值不是返回obj核心作用TS根据函数返回的布尔值决定是否把obj当作User类型处理返回true就当User返回false就不当User核心价值比强制类型断言更安全靠运行时检查确认类型。有没有同学好奇如果函数返回的是falseTS不把User当obj处理此时会把obj当什么类型处理答obj is User 只做「正向判定」函数返回 true→obj 是 User返回 false→obj 恢复定义时的原类型八、小结概念一句话典型场景string / number / boolean基础类型优先用接口字段、函数参数、状态any任意类型无检查临时兜底、兼容老代码少用unknown任意类型用前须收窄拿不准类型时的安全选择interface描述对象结构用户、配置、接口返回值type类型别名可联合/交叉状态枚举、函数类型、复杂组合记住三点能用具体类型就不用 any拿不准就用unknown再收窄。对象结构用 interface联合/函数/复杂类型用type。业务里够用就行不必一开始就追求完美先让类型系统帮你兜住大部分错误。把类型选对编译期就能发现很多问题后面的重构和维护都会轻松很多。 本系列专栏导航一、《TS 基础扫盲类型・接口・类型别名实战Vue TS 落地篇》二、《TS 进阶类型实战联合・交叉・Partial・Pick 用法Vue TS 落地篇》三、《Vue3 TS 实战setup/props/ref/reactive 类型注解Vue TS 落地篇》四、《接口类型管理实战从 any 到规范 api.d.tsVue TS 落地篇》 跟着系列慢慢学把技术功底扎扎实实地打牢学习本就是一场持久战不需要急着一口吃成胖子。哪怕今天你只记住了一点点这都是实打实的进步。后续我还会继续用这种大白话、讲实战方式带大家扫盲更多前端基础。关注我不迷路咱们把那些曾经模糊的知识点一个个彻底搞清楚。如果你觉得这篇内容对你有帮助不妨点赞收藏下次写代码卡壳时拿出来翻一翻比搜引擎更靠谱。我是 Eugene你的电子学友我们下一篇干货见

相关新闻

Qt:控件的封装、定时器、事件分发器、事件过滤器

Qt:控件的封装、定时器、事件分发器、事件过滤器

一、案例1:创建ui界面文件 1.直接创建含ui界面文件的类: 2.一个不含ui界面文件的类,如何与一个新建的ui界面文件(举例:form.ui)关联起来: 第一步:先添加一个界面文件 第二步:在类(举例:MainWindow).h文件…

2026/7/4 11:30:27 阅读更多 →
rk3568-linux5.10-buildroot系统新增分区方法

rk3568-linux5.10-buildroot系统新增分区方法

本文章主要实现通过源码新增ccc分区,如需要将应用或文件存放到特定分区下可参考以下方法新增分区。1、修改源码目录下的/tools/linux/Linux_Pack_Firmware/rockdev/rk356x-package-file文件新增ccc分区2、用以下命令在源码/rockdev路径下新建ccc.imgdd if/dev/zero …

2026/7/6 15:21:53 阅读更多 →
DDD如何指导微服务设计实现?——从拆分原则到代码落地

DDD如何指导微服务设计实现?——从拆分原则到代码落地

一、引言在前几篇文章中,我们已经完整走过了DDD的整个知识体系:战术设计:实体、值对象、聚合、领域服务、仓库、工厂、防腐层战略设计:领域、子域、限界上下文、统一语言、上下文地图建模实践:事件风暴会议、支付风控系…

2026/5/17 11:06:28 阅读更多 →

最新新闻

零绿幕直播革命:OBS AI背景移除插件完全指南

零绿幕直播革命:OBS AI背景移除插件完全指南

零绿幕直播革命:OBS AI背景移除插件完全指南 【免费下载链接】obs-backgroundremoval An OBS plugin for removing background in portrait images (video), making it easy to replace the background when recording or streaming. 项目地址: https://gitcode.c…

2026/7/6 17:53:35 阅读更多 →
关闭右键菜单中的“搜狗压缩”丨​​​​​​​如何将右键菜单的搜狗压缩去除?

关闭右键菜单中的“搜狗压缩”丨​​​​​​​如何将右键菜单的搜狗压缩去除?

搜狗压缩太流氓,天天弹窗要升级,提醒充会员云云,难以忍受。 如何将右键菜单的搜狗压缩去除? 简直是流氓软件,在我的右键菜单里太碍眼了 一点击就是充值入口,恶心 解决方法: 打开搜狗输入法设置…

2026/7/6 17:51:33 阅读更多 →
CodeQuery GUI深度使用:界面定制与主题配置指南

CodeQuery GUI深度使用:界面定制与主题配置指南

CodeQuery GUI深度使用:界面定制与主题配置指南 【免费下载链接】codequery A code-understanding, code-browsing or code-search tool. This is a tool to index, then query or search C, C, Java, Python, Ruby, Go and Javascript source code. It builds upon…

2026/7/6 17:47:29 阅读更多 →
为什么选择Linkora?揭秘这款本地优先链接管理器的7大核心优势

为什么选择Linkora?揭秘这款本地优先链接管理器的7大核心优势

为什么选择Linkora?揭秘这款本地优先链接管理器的7大核心优势 【免费下载链接】Linkora Local-first multiplatform link organizer with optional self-hosted sync. 项目地址: https://gitcode.com/gh_mirrors/li/Linkora 在信息爆炸的时代,我们…

2026/7/6 17:45:25 阅读更多 →
CZSC缠论插件:3分钟快速掌握通达信智能缠论分析终极指南

CZSC缠论插件:3分钟快速掌握通达信智能缠论分析终极指南

CZSC缠论插件:3分钟快速掌握通达信智能缠论分析终极指南 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 你是否曾为缠论复杂的图表分析而头疼?CZSC缠论可视化分析插件正是为你解决…

2026/7/6 17:43:24 阅读更多 →
Go语言运行时动态结构体:突破静态类型限制的架构创新

Go语言运行时动态结构体:突破静态类型限制的架构创新

Go语言运行时动态结构体:突破静态类型限制的架构创新 【免费下载链接】dynamic-struct Golang package for editing structs fields during runtime and mapping structs to other structs. 项目地址: https://gitcode.com/gh_mirrors/dy/dynamic-struct 在G…

2026/7/6 17:43:24 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻