TypeScript 核心语法应用 —— Vue 3 中的使用(上)
阅读本文你能学到什么如何为ref、reactive、computed标注类型如何为事件处理函数标注类型如何为模板引用标注类型如何处理对象的非空值场景前言前面五篇我们学完了 TypeScript 的核心语法——类型注解、接口、泛型、类型断言……学完之后你可能会有疑惑这些语法在 Vue 3 组件中怎么用这一篇就来看看。一、Vue 3 TS 项目环境使用 Vue 官方脚手架创建项目时直接选择TypeScript即可npmcreate vuelatest# 根据提示选择 TypeScript创建完成后项目会自动生成tsconfig.json配置文件不需要手动配置。 本文所有示例均基于script setup langts语法这是 Vue 官方推荐的组合式 API 写法。 项目创建的具体步骤可参考 Vue 官方文档。二、为什么需要标注类型在 Vue 3 中为数据标注类型核心好处有两个赋值时 TS 会校验数据类型是否匹配使用时编辑器会提供准确的代码提示看一个简单的对比import{reactive}fromvue// ❌ 没有标注类型constformreactive({username:,password:})form.username100// ✅ 不报错但 username 应该是 string// ✅ 标注了类型interfaceForm{username:stringpassword:string}constformreactiveForm({username:,password:})form.username100// ❌ 报错Type number is not assignable to type string有了类型约束赋值时的错误能被提前发现编辑器也能给出准确的代码提示。如下图所示输入form.时编辑器会提示 form 的属性username和password。三、为 ref 标注类型ref 和 TS 的配合通常分为两种方式类型推导和泛型指定类型。3.1 类型推导推荐简单数据如果初始值足够明确TypeScript 可以自动推导出类型import{ref}fromvueconstcountref(0)// 推导为 Refnumberconstnameref(Jack)// 推导为 RefstringconstisLoadingref(false)// 推导为 Refboolean如果 ref 没有初始值TypeScript 会自动推导为联合类型包含undefined赋值时同样需要符合类型要求constagerefnumber()// 推导为 Refnumber | undefined3.2 泛型指定类型推荐复杂数据当类型为复杂类型如联合类型如number | null、对象、数组用泛型指定类型import{ref}fromvue// 联合类型constyearrefnumber|null(null)year.value2026// ✅year.value2026// ❌ 报错Type string is not assignable to type number// 对象类型interfaceUser{id:numbername:stringage:number}constuserrefUser|null(null)user.value{id:1,name:张三,age:18}用泛型指定类型不仅对 value 的赋值和初始值做了类型约束使用时也有准确的代码提示效果和第二章展示的类似。四、为 reactive 标注类型reactive 和 TS 的配合通常也分为两种方式类型推导和泛型指定类型。4.1 类型推导推荐如果根据默认参数推导出的类型符合要求直接使用类型推导即可import{reactive}fromvueconststatereactive({count:0,name:Jack})// state 的类型为{ count: number; name: string }4.2 泛型指定类型类型不匹配时使用如果默认对象推导出的类型不满足要求可以使用泛型显式指定类型import{reactive}fromvueinterfaceState{count:numbername:stringisLoading:boolean}conststatereactiveState({count:0,name:Jack,isLoading:false})state.count10state.isLoadingtruestate.count10// ❌ 报错Type number is not assignable to type string显式标注类型不仅对属性赋值做了类型约束reactive的初始值也需要满足类型要求使用时也有准确的代码提示如下图所示。五、为 computed 标注类型计算属性由已知的响应式数据计算得到依赖的数据类型一旦确定TypeScript 会自动推导出计算属性的类型。因此多数情况下不需要手动标注类型TS 会提供准确的代码提示。constcountref(0)// 推导为 RefnumberconstdoubleCountcomputed((){returncount.value*2})// 推导为 ComputedRefnumber如果计算逻辑较复杂或者需要确保返回类型符合预期也可以显式指定interfaceProduct{id:stringname:stringprice:number}constproductsrefProduct[]([{id:1001,name:男鞋,price:299},{id:1002,name:女鞋,price:205},{id:1003,name:衬衫,price:99}])// 计算总价显式指定类型consttotalPricecomputednumber((){returnproducts.value.reduce((sum,item)sumitem.price,0)})// 过滤价格大于 200 的商品自动推导constexpensiveProductscomputed((){returnproducts.value.filter(itemitem.price200)})六、为事件处理函数标注类型原生 DOM 事件处理函数的参数默认会被推断为any类型没有任何类型提示。templateinputtypetextchangeinputChange//templatescriptsetuplangtsconstinputChange(e){// e 自动推断为 any 类型}/script想要有良好的类型提示我们需要手动标注类型事件处理函数的类型标注主要做两件事① 标注事件对象类型给事件对象形参e标注为Event类型可以获得事件对象的相关类型提示constinputChange(e:Event){// 获得事件对象的类型提示}② 使用断言获取更精确的类型如果需要更精确的 DOM 类型提示可以使用断言as进行操作constinputChange(e:Event){consttargete.targetasHTMLInputElement// 获取更精确的 DOM 类型}七、为模板引用标注类型7.1 如何进行类型标注通过具体的 DOM 类型联合null作为泛型参数。比如我们想获取一个inputDOM 元素templateinputrefinputRef//templatescriptsetuplangtsimport{ref,onMounted}fromvueconstinputRefrefHTMLInputElement|null(null)onMounted((){// 使用可选链防止类型错误inputRef.value?.focus()})/script说明泛型参数中通过将获取的 DOM 实际类型联合null进行类型标注组件完全挂载完毕之前 ref 的值都是null所以访问ref.value时需要使用可选链防止类型错误7.2 常见 DOM 元素类型元素类型TypeScript 类型divHTMLDivElementspanHTMLSpanElementinputHTMLInputElementbuttonHTMLButtonElementaHTMLAnchorElementformHTMLFormElementimgHTMLImageElement八、对象的非空值处理8.1 空值场景说明当对象的属性可能是null或undefined时我们称之为“空值”。直接访问空值上的属性或方法TypeScript 会报类型错误。比如inputRef在组件挂载完毕之前value还是null如果直接调用focus()TS 就会报错constinputRefrefHTMLInputElement|null(null)onMounted((){inputRef.value.focus()// ❌ 对象可能为 null})8.2 可选链方案推荐可选链?.是一种安全访问嵌套对象属性的方式。当可选链前面的值为undefined或null时它会停止运算并返回undefined不会报错constinputRefrefHTMLInputElement|null(null)onMounted((){inputRef.value?.focus()// 可选链安全访问})8.3 逻辑判断方案通过逻辑判断只有确认值存在时才继续访问属性constinputRefrefHTMLInputElement|null(null)onMounted((){if(inputRef.value){inputRef.value.focus()// 逻辑判断确认存在}})8.4 非空断言方案谨慎使用非空断言!用于告诉 TypeScript开发者明确知道当前的值一定不是null或undefined让 TS 通过类型校验constinputRefrefHTMLInputElement|null(null)onMounted((){inputRef.value!.focus()// 非空断言仅在确定有值时使用})⚠️注意使用非空断言要格外小心。它没有实际的 JS 判断逻辑只是通过了 TS 的类型校验。如果实际运行时值为null程序会直接报错。小结知识点示例说明ref 类型注解refUser | null(null)复杂数据用泛型指定类型reactive 类型注解reactiveState({ ... })类型不匹配时用泛型指定类型computed 类型注解computednumber(() ...)指定返回值类型事件处理函数e: Event标注事件对象类型获得类型提示模板引用refHTMLInputElement | null(null)为 DOM 元素添加类型约束可选链inputRef.value?.focus()安全访问可能为空的值非空断言inputRef.value!.focus()仅在确定值不为空时使用需谨慎参考资料Vue 3 官方文档 —— TypeScript 与组合式 API上一篇TypeScript 高级特性 —— 类型断言与泛型下一篇TypeScript 核心语法应用 —— Vue 3 中的使用下

相关新闻

Stream 流式编程:并行流

Stream 流式编程:并行流

目录 并行流的定义 如何使用并行流提高性能 并行流的适用场景 并行流的注意事项 并行流的性能分析 用ForkJoinPool的眼光来看ParallelStream 并行流的定义 在Java 8中,Stream提供了顺序流(Sequential Stream)和并行流(Paral…

2026/8/23 17:57:21 阅读更多 →
【Docker项目实战】Docker环境下部署immich照片管理系统

【Docker项目实战】Docker环境下部署immich照片管理系统

【Docker项目实战】Docker环境下部署immich照片管理系统一、immich介绍1.1 immich简介1.2 immich注意事项1.3 immich使用场景二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载i…

2026/8/23 22:17:48 阅读更多 →
Go微服务链路追踪从Jaeger到OpenTelemetry的完整实践

Go微服务链路追踪从Jaeger到OpenTelemetry的完整实践

Go微服务链路追踪Jaeger-OpenTelemetry集成实战 文章导语 在微服务架构中,一个用户请求可能经过10个服务。当出现延迟或错误时,如何快速定位问题?分布式链路追踪就是为此而生。本文基于Jaeger和OpenTelemetry,在Go微服务中实现完整…

2026/8/23 16:53:24 阅读更多 →

最新新闻

零门槛上手BiliRoaming:区域解锁一份就够的指南

零门槛上手BiliRoaming:区域解锁一份就够的指南

零门槛上手BiliRoaming:区域解锁一份就够的指南 【免费下载链接】BiliRoaming 哔哩漫游,解除B站客户端番剧区域限制的Xposed模块,并且提供其他小功能。An Xposed module that unblocks bangumi area limit of BILIBILI with miscellaneous fe…

2026/8/24 5:33:54 阅读更多 →
.NET Framework项目配置CommunityToolkit.Mvvm源生成器实现MVVM自动化

.NET Framework项目配置CommunityToolkit.Mvvm源生成器实现MVVM自动化

如果你正在开发一个 .NET MAUI、WPF 或 WinUI 3 应用,并且厌倦了手动编写那些重复、冗长且容易出错的 MVVM 样板代码——比如为每个属性实现INotifyPropertyChanged,或者为每个命令编写ICommand的包装器,那么这篇文章就是为你准备的。很多开发…

2026/8/24 5:33:54 阅读更多 →
Java位运算实战:从面试题到HashMap底层优化

Java位运算实战:从面试题到HashMap底层优化

1. 为什么Java面试官总爱问位运算——它真只是“老古董”吗&#xff1f; 你可能在刷Java八股文时&#xff0c;看到“&、|、^、<<、>>、~、>>>”这七个符号&#xff0c;第一反应是&#xff1a;“这玩意儿我写业务代码十年都没用过&#xff0c;背它干啥…

2026/8/24 5:33:54 阅读更多 →
深度学习GPU环境搭建:从显卡算力到PyTorch的完整依赖链解析

深度学习GPU环境搭建:从显卡算力到PyTorch的完整依赖链解析

1. 项目概述&#xff1a;从“能用”到“好用”的GPU深度学习环境构建 如果你刚拿到一块新显卡&#xff0c;兴冲冲地打开PyTorch官网准备安装GPU版本&#xff0c;大概率会被“CUDA 11.8”、“CUDA 12.1”、“Compute Platform”这些选项搞得一头雾水。更让人崩溃的是&#xff0…

2026/8/24 5:33:54 阅读更多 →
RGB与CMYK色彩模型解析:从原理到Python图像处理实践

RGB与CMYK色彩模型解析:从原理到Python图像处理实践

1. 项目概述&#xff1a;从“两种三原色”说起刚入行做设计或者搞图像处理的朋友&#xff0c;估计都听过“三原色”这个词&#xff0c;但很多人可能没细想过&#xff0c;其实我们日常打交道的是两套完全不同的三原色系统。一个叫RGB&#xff0c;另一个叫CMY(K)。这可不是什么高…

2026/8/24 5:33:54 阅读更多 →
PyTorch图像分类实战:HW03人狗二分类全流程避坑指南

PyTorch图像分类实战:HW03人狗二分类全流程避坑指南

1. 这不是一份“抄作业指南”&#xff0c;而是一次真实的HW03攻坚复盘李宏毅2023机器学习作业HW03&#xff0c;标题写着“图像分类”&#xff0c;但实际踩进去才发现&#xff0c;它根本不是让你调个ResNet跑个准确率就完事的入门练习。这道题真正考的是&#xff1a;你能不能在有…

2026/8/24 5:32:53 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力&#xff1b;确需渲染 HTML 时&#xff0c;先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述&#xff1a;Windows登录密码的“黑匣子”每次你按下CtrlAltDel&#xff0c;输入密码&#xff0c;然后看到那个熟悉的桌面&#xff0c;这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者&#xff0c;我经常被问到&#xff1a;“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述&#xff1a;AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时&#xff0c;遇到一个典型案例&#xff1a;候选人在视频面试中无意提到竞争对手产品名称&#xff0c;系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →