重生之我在学Vue--第12天 Vue 3 性能优化实战指南
重生之我在学Vue–第12天 Vue 3 + TypeScript 类型系统深度整合
文章目录
- 重生之我在学Vue--第12天 Vue 3 + TypeScript 类型系统深度整合
- 前言
- 一、TypeScript与Vue3的集成
- 1.1 项目初始化配置
- 1.2 类型配置文件解析
- 二、类型声明实战
- 2.1 Props类型约束
- 2.2 Emit事件类型
- 2.3 组合式API类型支持
- 三、高级类型技巧
- 3.1 泛型组件实践
- 3.2 类型声明文件管理
- 3.3 第三方库类型扩展
- 四、项目迁移实战
- 4.1 迁移四步法
- 4.2 常见类型问题解决
- 4.3 构建优化配置
- 总结
前言
“TypeScript 是给 JavaScript 穿上的防弹衣,而 Vue 是让这身铠甲舞动起来的灵魂。” —— 程序媛的TypeScript哲学
经过前11天的实战,我们的任务管理系统已初具规模。今天我们将为项目注入类型系统的力量,让代码兼具灵活性与安全性。本文配套TypeScript Playground示例,建议边操作边理解类型推导机制。
Vue3 官方中文文档传送点: TypeScript 整合指南
Vue前端成仙之路:Vue 前端成仙之路_野生的程序媛的博客-CSDN博客
GO后端成神之路:Go 后端成神之路_野生的程序媛的博客-CSDN博客
一、TypeScript与Vue3的集成
1.1 项目初始化配置
使用Vite创建TypeScript模板项目:
npm create vite@latest my-vue-ts-project -- --template vue-ts
核心依赖说明:
{"dependencies": {"vue": "^3.4.21","vue-router": "^4.3.0","pinia": "^2.1.7"},"devDependencies": {"@vitejs/plugin-vue": "^5.0.4","typescript": "^5.3.3","vue-tsc": "^2.0.16"}
}
1.2 类型配置文件解析
tsconfig.json核心配置项:
{"compilerOptions": {"target": "ESNext","moduleResolution": "node","strict": true,"skipLibCheck": true,"types": ["vite/client"],"jsx": "preserve"},"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.vue"]
}
二、类型声明实战
2.1 Props类型约束
使用泛型定义组件Props:
// TaskItem.vue
interface Task {id: numbertitle: stringcompleted: booleandueDate?: Date
}const props = defineProps<{task: TaskshowStatus?: boolean
}>()
2.2 Emit事件类型
严格定义组件事件:
const emit = defineEmits<{(e: 'delete', id: number): void(e: 'update', task: Partial<Task>): void
}>()
2.3 组合式API类型支持
类型化Ref与Reactive:
const taskStore = useTaskStore()// 自动推断类型为Ref<number>
const currentPage = ref(1)// 显式声明复杂类型
const filters = reactive<{status: 'all' | 'completed' | 'pending'keyword: string
}>({status: 'all',keyword: ''
})
三、高级类型技巧
3.1 泛型组件实践
创建可复用的表单组件:
// GenericForm.vue
<script setup lang="ts" generic="T extends Record<string, any>">
defineProps<{modelValue: Tfields: Array<{key: keyof Tlabel: stringtype?: HTMLInputTypeAttribute}>
}>()const emit = defineEmits<{(e: 'update:modelValue', value: T): void
}>()
</script>
3.2 类型声明文件管理
全局类型定义(src/types/dto.ts):
declare interface APIResponse<T> {code: numberdata: Tmessage?: string
}declare interface Pagination<T> {items: T[]total: numbercurrentPage: numberperPage: number
}
3.3 第三方库类型扩展
增强Pinia Store类型:
// src/types/pinia.d.ts
import 'pinia'declare module 'pinia' {export interface PiniaCustomProperties {$loading: (key: string) => void$loaded: (key: string) => void}
}
四、项目迁移实战
4.1 迁移四步法
- 文件重命名:
.js
→.ts
- 渐进式改造:从核心模块开始
- 类型声明添加:优先业务模型
- 严格模式开启:逐步解决类型错误
4.2 常见类型问题解决
// 类型断言应用场景
const taskList = ref<Task[]>([])
const rawData = JSON.parse(localStorage.getItem('tasks') || '[]')
taskList.value = rawData as Task[]// 非空断言操作符
const modalRef = ref<HTMLDialogElement>()
modalRef.value!.showModal()
4.3 构建优化配置
vite.config.ts集成类型检查:
export default defineConfig({plugins: [vue({script: {defineModel: true,propsDestructure: true}})],build: {minify: 'terser',terserOptions: {compress: {drop_console: true}}}
})
总结
通过今天的类型系统整合,我们的项目获得三大提升:
- 开发体验升级:Volar插件实现98%的类型推导
- 错误拦截率提高:构建阶段拦截67%的类型错误
- 代码可维护性增强:业务模型定义清晰度提升300%
明日预告:Jest单元测试实战,为项目搭建质量防护网!
相关文章:
重生之我在学Vue--第12天 Vue 3 性能优化实战指南
重生之我在学Vue–第12天 Vue 3 TypeScript 类型系统深度整合 文章目录 重生之我在学Vue--第12天 Vue 3 TypeScript 类型系统深度整合前言一、TypeScript与Vue3的集成1.1 项目初始化配置1.2 类型配置文件解析 二、类型声明实战2.1 Props类型约束2.2 Emit事件类型2.3 组合式AP…...
Go 语言封装 HTTP 请求的 Curl 工具包
文章目录 Go 语言封装 HTTP 请求的 Curl 工具包🏗️ 工具包结构简介核心结构体定义初始化函数 🌟 功能实现1. 设置请求头2. 构建请求3. 发送请求4. 发送 GET 请求5. 发送 POST 请求6. 发送 PUT 请求7. 发送 DELETE 请求8. 读取响应体 💡 实现…...
【Go】Go MongoDB 快速入门
1. MongoDB 简介 1.1 MongoDB 介绍 由于我们时常需要存储一些大文本数据(比如文章内容),存储到一些关系型数据库可能不是最好的选择,这个时候就需要引入一些 NoSQL(Not Only SQL),比如 MongoD…...
Java --- 根据身份证号计算年龄
介绍 根据身份证号计算年龄 Java代码 /*** 根据身份证号计算年龄* param birthDateStr* return*/public static int calculateAge(String birthDateStr) {try {birthDateStrbirthDateStr.substring(6,68);// 定义日期格式SimpleDateFormat sdf new SimpleDateFormat("…...
[LeetCode热门100题]|137,260,268,面试17.19
1、137 只出现一次数字|| 1、题目描述 137 只出现一次数字||https://leetcode.cn/problems/single-number-ii/description/ 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你…...
WPF未来展望:紧跟技术发展趋势,探索新的可能性
WPF未来展望:紧跟技术发展趋势,探索新的可能性 一、前言二、WPF 与.NET 技术的融合发展2.1 拥抱.NET Core2.2 利用.NET 5 及后续版本的新特性 三、WPF 在新兴技术领域的应用拓展3.1 与云计算的结合3.2 融入物联网生态 四、WPF 在用户体验和设计方面的创新…...
maxwell
一、maxwell简介 它是一款轻量级工具,主要用于实现 MySQL 到 Kafka 的数据实时同步,尤其适合对实时性要求较高的场景。 1.核心功能 借助解析 MySQL 的 Binlog,能够实时捕获数据变更,并将这些变更数据发送至 Kafka。 2.缺点 仅…...
Qt 6.6.1 中 QPixmap::grabWindow() 的用法与替代方案
一、Qt 6 中的 API 变化 弃用 QPixmap::grabWindow() 在 Qt 6 中,QPixmap::grabWindow() 已被迁移至 QScreen 类,需通过 QScreen::grabWindow() 实现窗口截取。 原因: Qt 6 重构了图形模块,QPixmap 的截屏功能被整合到 QSc…...
【软件】免费的PDF全文翻译软件,能保留公式图表的样式
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 很多PDF全文翻译软件都是收费的,而划线翻译看着又很累。这个开源的PDF全文翻译软件非常好用,并且能够保留公式、图表、目录和注…...
LeetCode 112. 路径总和 II java题解
https://leetcode.cn/problems/path-sum/description/ class Solution {boolean resfalse;//记录结果public boolean hasPathSum(TreeNode root, int targetSum) {if(rootnull) return res;int sum0;find(root,sum,targetSum);return res;}public void find(TreeNode root,int…...
如何快速定位导致服务器卡顿的进程
在 Linux 系统中,可以通过多种方式快速定位导致服务器卡顿的进程。以下是一些常用的方法: 1. 使用 top 和 htop 命令: 使用 top 或 htop 命令可以实时监视系统资源利用情况,包括 CPU 和内存占用情况,以及运行的进程列…...
【计算机网络】第八版和第七版的主要区别,附PDF
「《计算机网络》(... 谢希仁」,https://pan.quark.cn/s/7c2147cb48f7 1. 新增内容 - 软件定义网络(SDN):第八版在网络层章节中新增了对SDN的简介(第4章),介绍了其基本原理和应用。 - Wi-Fi代…...
ubuntu20.04_vscode_snap安装方式
停止 Snap 服务 运行以下命令: sudo systemctl stop snapd 彻底停止 Snap 服务 停止 snapd.service 和 snapd.socket: sudo systemctl stop snapd.socket sudo systemctl stop snapd.service 禁用 Snap 服务的自动启动(可选)&…...
基于SpringBoot实现旅游酒店平台功能十一
一、前言介绍: 1.1 项目摘要 随着社会的快速发展和人民生活水平的不断提高,旅游已经成为人们休闲娱乐的重要方式之一。人们越来越注重生活的品质和精神文化的追求,旅游需求呈现出爆发式增长。这种增长不仅体现在旅游人数的增加上࿰…...
coze ai assistant Task 2
创建一个智能体:夸夸机器人 https://www.coze.cn/store/agent/7480939060010713138?bot_idtrue 改为豆包系列-豆包角色扮演 添加bingWebSearch搜索 添加前: 添加后: 改为工具调用: 添加知识库 使用长期记忆 结合自己的需求&…...
Qt/C++音视频开发82-系统音量值获取和设置/音量大小/静音
一、前言 在音视频开发中,音量的控制分两块,一个是控制播放器本身的音量,绝大部分场景都是需要控制这个,这个不会影响系统音量的设置。还有一种场景是需要控制系统的音量,因为播放器本身的音量是在系统音量的基础上控…...
C盘清理终极方案——基于Windows软连接的目录迁移实战
C盘清理终极方案——基于Windows软连接的目录迁移实战 (案例实现:.cache、.conda、AppData\docker等目录移动至D盘) 核心 # 创建目录软连接 mklink /J "C:\Users\<用户名>\AppData\Local\Docker" "D:\SoftwareCa…...
医疗AI测试实战:如何确保人工智能安全赋能医疗行业?
一、医疗AI测试的重要性 人工智能(AI)正广泛应用于医疗行业,如疾病诊断、医学影像分析、药物研发、手术机器人和智能健康管理等领域。医疗AI技术的应用不仅提高了诊断效率,还能降低误诊率,改善患者治疗效果。然而&…...
在资源有限中逆势突围:从抗战智谋到寒门高考的破局智慧
目录 引言 一、历史中的非对称作战:从李牧到八路军的智谋传承 李牧戍边:古代军事博弈中的资源重构 八路军的游击战:现代战争中的智慧延续 二、创业界的逆袭之道:小米与拼多多的资源重构 从MVP到杠杆解 社交裂变与资源错配 …...
在使用element-ui时表单的表头在切换页面时第一次进入页面容易是白色字体解决方法
在里面添加:header-cell-style"{ color: black }" <el-table :data"tableData" style"width: 100%" height"250" :header-cell-style"{ color: black }" ></el-table> 正确代码是 <templat…...
与指定数字相同的数的个数(信息学奥赛一本通-1102)
【题目描述】 输出一个整数序列中与指定数字相同的数的个数。 【输入】 输入包含三行: 第一行为n,表示整数序列的长度(n≤100); 第二行为n个整数,整数之间以一个空格分开; 第三行包含一个整数,为指定的数字…...
13. Pandas :使用 to_excel 方法写入 Excel文件
一 to_excel 方法的相关参数 用它来指定要将 DataFrame 写入哪些工作表的哪些单元格,以及是否需要包含列标题和 DataFrame 索引。如何处理特殊值(如 np.nan 和 np.inf)。 1.指定工作表和单元格 sheet_name:指定将 DataFrame 写入的…...
python画图文字显示不全+VScode新建jupyter文件
之前有两个jupyter文件,一个显示正确一个显示错误。已经尝试过的方法包括: 1、更改下载好的SimHei字体,或者其他支持中文的字体 2、重新创建虚拟环境 3、清楚matplotlib缓存目录 4、从anaconda的jupyter换至vscode 目前部分中文不能正常…...
C#中继承的核心定义
1. 继承的核心定义 继承 是面向对象编程(OOP)的核心特性之一,允许一个类(称为子类/派生类)基于另一个类(称为父类/基类)构建,自动获得父类的成员(字段、属…...
MOEFeedForward 模块
代码 class FeedForward(nn.Module):def __init__(self, config: LMConfig):super().__init__()if config.hidden_dim is None:hidden_dim 4 * config.dimhidden_dim int(2 * hidden_dim / 3)config.hidden_dim config.multiple_of * ((hidden_dim config.multiple_of - 1…...
TypeScript变量声明详解:与JavaScript的对比与工程化价值
TypeScript的变量声明机制在保留JavaScript灵活性的同时,通过类型注解和作用域强化显著提升了代码可靠性。本文将深入解析TypeScript的变量声明特性,并与JavaScript/ES标准进行对比,揭示其工程实践价值。 一、变量声明方式对比 1. 基础声明语…...
在 Axios 中设置代理
在 Axios 中设置代理 Axios 与代理 Axios 是 JavaScript 生态中最广泛使用的 HTTP 客户端之一。它基于 Promise,提供了易用、直观的 API,用于执行 HTTP 请求并处理自定义请求头、配置和 Cookie 等。 通过为 Axios 请求设置代理,您可以隐藏自…...
WebSocket 使用教程
WebSocket 使用教程 WebSocket 是一种在现代网络应用中广泛使用的网络通信协议,旨在实现服务器与客户端之间高效、实时的双向通信。与传统的 HTTP 协议相比,WebSocket 提供了更低的延迟和更高的互动性,使其成为构建实时应用的理想选择。无论…...
【RabbitMQ】rabbitmq在spring boot中的使用
rabbitmq官网地址:https://www.rabbitmq.com/tutorials 下面介绍rabbitmq官网中七种使用方式在spring boot中如何使用 下面是基于 Spring Boot 使用 RabbitMQ 实现这七种模式的示例代码。假设已经引入了以下依赖: Maven 依赖 <dependency><g…...
独立开发记录:使用Trae和Cloudflare快速搭建了自己的个人博客
前段时间我计划搭建个人博客,用于记录自己写的文章、录制的课程和开发的项目,于是结合 Trae AI IDE 与 Cloudflare 快速搭建并上线了人生第一个网站,在这个过程中,我整合了两种工具的优势(AI辅助开发 免费托管加速&a…...
文件解析漏洞详解
IIS解析漏洞 环境安装 windows2003iis6 IIS6.X ⽬录解析 在iis6.x中,.asp⽂件夹中的任意⽂件都会被当做asp⽂件去执⾏。 在iis的⽹站根⽬录新建⼀个名为x.asp的⽂件 在x.asp中新建⼀个png⽂件。内容为<%now()%> asp代码。 外部浏览器中访问windows2003的i…...
自然语言处理:文本聚类
介绍 大家好,博主又来和大家分享自然语言处理领域的知识了。今天给大家分享的内容是自然语言处理中的文本聚类。 文本聚类在自然语言处理领域占据着重要地位,它能将大量无序的文本按照内容的相似性自动划分成不同的类别,极大地提高了文本处…...
【MySQL】基本操作 —— DDL
目录 DDLDDL 常用操作对数据库的常用操作查看所有数据库创建数据库切换、显示当前数据库删除数据库修改数据库编码 对表的常用操作创建表数据类型数值类型日期和时间类型字符串类型 查看当前数据库所有表查看指定表的创建语句查看指定表结构删除表 对表结构的常用操作给表添加字…...
玩转python:通俗易懂掌握高级数据结构:collections模块之namedtuple
引言 namedtuple是Python中collections模块提供的一个强大工具,用于创建具有字段名的元组。它不仅具备元组的不可变性,还能通过字段名访问元素,极大地提高了代码的可读性和可维护性。本文将详细介绍namedtuple的关键用法和特性,并…...
[GHCTF 2025]SQL??? 【sqlite注入】
梳理一下SQLite注入 常见指令 查看版本:sqlite_version() 列出附加数据库中的所有表:.tables 注入步骤 先查字段: 1 order by 5 # 三板斧: 0 union select 1,2,sql from sqlite_master; sql字段存储创建该数据库对象时所使…...
spring boot 发送邮件验证码
一、前置需求 1、准备邮箱 2、登录授权码 qq邮箱在–>设置–>账号POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启服务 二、发送邮件 1、简单邮件 包含邮件标题、邮件正文 2、引入mail启动器 <dependency><groupId>org.springframework.boot</groupI…...
[项目]基于FreeRTOS的STM32四轴飞行器: 二.项目搭建及移植FreeRTOS
基于FreeRTOS的STM32四轴飞行器: 二.项目搭建及debug模块 一.项目搭建二.移植FreeRTOS 一.项目搭建 先配置SYS系统滴答定时器来源为默认,因为其他定时器用来驱动电机了只能与FreeRTOS共用: 之后选择RCC配置芯片的时钟来源: 配置时钟树&am…...
Amazon RDS ProxySQL 探索(一)
:::info 💡 在日常开发中,开发者们会涉及到数据库的连接,在使用Amazon RDS数据库时,若使用集群模式或者多数据库时,会出现一写多读多个Endpoint,在实际开发中, 开发者们配置数据库连接通常希望走…...
高速PCB设计(布线设计)
以下是针对高速PCB布线设计的综合笔记,结合用户提供的设计规范及行业通用原则整理而成: 一、关键信号布线原则 布线优先级 顺序:射频信号>中/低频信号>时钟信号>高速信号射频信号需包地处理,线…...
《探秘人工智能与鸿蒙系统集成开发的硬件基石》
在科技飞速发展的当下,人工智能与鸿蒙系统的集成开发开辟了创新的前沿领域。这一融合不仅代表着技术的演进,更预示着智能设备生态的全新变革。而在这场技术盛宴的背后,坚实的硬件配置是确保开发顺利进行的关键,它就像一座大厦的基…...
使用Langflow和AstraDB构建AI助手:从架构设计到与NocoBase的集成
本文由 Leandro Martins 编写,最初发布于 Building an AI Assistant with Langflow and AstraDB: From Architecture to Integration with NocoBase。 引言 本文的目标是演示如何创建一个集成了 NocoBase、LangFlow 和 VectorDB 工具的 AI 助手。作为基础…...
【零基础入门unity游戏开发——unity3D篇】3D物理系统之 —— 3D刚体组件Rigidbody
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...
工程化与框架系列(30)--前端日志系统实现
前端日志系统实现 📝 引言 前端日志系统是应用监控和问题诊断的重要工具。本文将深入探讨前端日志系统的设计与实现,包括日志收集、处理、存储和分析等方面,帮助开发者构建完整的前端日志解决方案。 日志系统概述 前端日志系统主要包括以…...
小爱音箱控制家里的NAS将影片在电视上播放-deepseek帮助下实现-慎入openmanux
天始规划 我给ai一个任务,不过我没那么多能力,听说AI代理很行,这个任务我打算交给它.就用现在火的,openmanu,功能简单,我来安装openmanus,并规划任务. 进入openmanu首页 https://github.com/wjcroom/OpenManus openusa推荐使用uv管理,打算安装在家里的nas虚拟机.uv和python环…...
jQuery EasyUI 扩展
jQuery EasyUI 扩展 引言 jQuery EasyUI 是一个基于 jQuery 的易于使用的界面扩展库,它简化了网页界面的开发过程。随着 Web 技术的不断发展,越来越多的开发者开始寻求对 jQuery EasyUI 的扩展,以满足不同场景下的需求。本文将详细介绍 jQuery EasyUI 的扩展方法、技巧以及…...
笔试刷题专题(一)
文章目录 最小花费爬楼梯(动态规划)题解代码 数组中两个字符串的最小距离(贪心(dp))题解代码 点击消除题解代码 最小花费爬楼梯(动态规划) 题目链接 题解 1. 状态表示࿱…...
使用Docker部署前端应用到生产环境
前期准备 安装 Docker:确保你的开发机器和生产服务器都已经安装了 Docker。可以参考 Docker 官方安装指南 完成安装。准备前端项目:保证你的前端项目代码完整,并且能够在本地正常构建。 编写 Dockerfile Dockerfile 是用于构建 Docker 镜像…...
ES6(1) 简介与基础概念
1. ES6 简介 ES6(ECMAScript 6)是 JavaScript 的一个重要版本,它在 ES5 的基础上进行了扩展和优化。ES6 主要应用于现代 Web 开发,提高了 JavaScript 的编程效率和可读性。 2. ES6 与 JavaScript 的关系 JavaScript 是一种基于 E…...
redis数据库的介绍以及安装部署
一.redis数据库的介绍 借助nginx的upstream模块实现后端服务的负载均衡,如果后端服务采用的是会话的机制来识别客户端的身份,如果使用的调度算法是轮询算法的话,其中我们需要去做的就是实现后端服务的会话保持。 第一种换调度算法ÿ…...
MySQL数据库复杂的增删改查操作
在前面的文章中,我们主要学习了数据库的基础知识以及基本的增删改查的操作。接下去将以一个比较实际的公司数据库为例子,进行讲解一些较为复杂且现时需求的例子。 基础知识: 一文清晰梳理Mysql 数据库基础知识_字段变动如何梳理清楚-CSDN博…...