重生之我在学Vue--第12天 Vue 3 性能优化实战指南

重生之我在学Vue--第12天 Vue 3 + TypeScript 类型系统深度整合

文章目录

  • [重生之我在学Vue--第12天 Vue 3 + TypeScript 类型系统深度整合](#重生之我在学Vue--第12天 Vue 3 + TypeScript 类型系统深度整合)
    • 前言
    • 一、TypeScript与Vue3的集成
      • [1.1 项目初始化配置](#1.1 项目初始化配置)
      • [1.2 类型配置文件解析](#1.2 类型配置文件解析)
    • 二、类型声明实战
      • [2.1 Props类型约束](#2.1 Props类型约束)
      • [2.2 Emit事件类型](#2.2 Emit事件类型)
      • [2.3 组合式API类型支持](#2.3 组合式API类型支持)
    • 三、高级类型技巧
      • [3.1 泛型组件实践](#3.1 泛型组件实践)
      • [3.2 类型声明文件管理](#3.2 类型声明文件管理)
      • [3.3 第三方库类型扩展](#3.3 第三方库类型扩展)
    • 四、项目迁移实战
      • [4.1 迁移四步法](#4.1 迁移四步法)
      • [4.2 常见类型问题解决](#4.2 常见类型问题解决)
      • [4.3 构建优化配置](#4.3 构建优化配置)
    • 总结

前言

"TypeScript 是给 JavaScript 穿上的防弹衣,而 Vue 是让这身铠甲舞动起来的灵魂。" ------ 程序媛的TypeScript哲学

经过前11天的实战,我们的任务管理系统已初具规模。今天我们将为项目注入类型系统的力量,让代码兼具灵活性与安全性。本文配套TypeScript Playground示例,建议边操作边理解类型推导机制。

Vue3 官方中文文档传送点: TypeScript 整合指南

Vue前端成仙之路:Vue 前端成仙之路_野生的程序媛的博客-CSDN博客

GO后端成神之路:Go 后端成神之路_野生的程序媛的博客-CSDN博客

一、TypeScript与Vue3的集成

1.1 项目初始化配置

使用Vite创建TypeScript模板项目:

bash 复制代码
npm create vite@latest my-vue-ts-project -- --template vue-ts

核心依赖说明:

json 复制代码
{
  "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核心配置项:

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:

typescript 复制代码
// TaskItem.vue
interface Task {
  id: number
  title: string
  completed: boolean
  dueDate?: Date
}

const props = defineProps<{
  task: Task
  showStatus?: boolean
}>()

2.2 Emit事件类型

严格定义组件事件:

typescript 复制代码
const emit = defineEmits<{
  (e: 'delete', id: number): void
  (e: 'update', task: Partial<Task>): void
}>()

2.3 组合式API类型支持

类型化Ref与Reactive:

typescript 复制代码
const taskStore = useTaskStore()

// 自动推断类型为Ref<number>
const currentPage = ref(1)

// 显式声明复杂类型
const filters = reactive<{
  status: 'all' | 'completed' | 'pending'
  keyword: string
}>({
  status: 'all',
  keyword: ''
})

三、高级类型技巧

3.1 泛型组件实践

创建可复用的表单组件:

typescript 复制代码
// GenericForm.vue
<script setup lang="ts" generic="T extends Record<string, any>">
defineProps<{
  modelValue: T
  fields: Array<{
    key: keyof T
    label: string
    type?: HTMLInputTypeAttribute
  }>
}>()

const emit = defineEmits<{
  (e: 'update:modelValue', value: T): void
}>()
</script>

3.2 类型声明文件管理

全局类型定义(src/types/dto.ts):

typescript 复制代码
declare interface APIResponse<T> {
  code: number
  data: T
  message?: string
}

declare interface Pagination<T> {
  items: T[]
  total: number
  currentPage: number
  perPage: number
}

3.3 第三方库类型扩展

增强Pinia Store类型:

typescript 复制代码
// src/types/pinia.d.ts
import 'pinia'

declare module 'pinia' {
  export interface PiniaCustomProperties {
    $loading: (key: string) => void
    $loaded: (key: string) => void
  }
}

四、项目迁移实战

4.1 迁移四步法

  1. 文件重命名.js.ts
  2. 渐进式改造:从核心模块开始
  3. 类型声明添加:优先业务模型
  4. 严格模式开启:逐步解决类型错误

4.2 常见类型问题解决

typescript 复制代码
// 类型断言应用场景
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集成类型检查:

typescript 复制代码
export default defineConfig({
  plugins: [
    vue({
      script: {
        defineModel: true,
        propsDestructure: true
      }
    })
  ],
  build: {
    minify: 'terser',
    terserOptions: {
      compress: {
        drop_console: true
      }
    }
  }
})

总结

通过今天的类型系统整合,我们的项目获得三大提升:

  1. 开发体验升级:Volar插件实现98%的类型推导
  2. 错误拦截率提高:构建阶段拦截67%的类型错误
  3. 代码可维护性增强:业务模型定义清晰度提升300%

明日预告:Jest单元测试实战,为项目搭建质量防护网!

相关推荐
崔庆才丨静觅3 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60614 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了4 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅4 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅5 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅5 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment5 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅5 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊5 小时前
jwt介绍
前端
爱敲代码的小鱼5 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax