Vue3 + TypeScript

news2025/1/11 11:18:16

Vue3 + TS开发环境创建

1. 创建环境

vite除了支持基础阶段的纯TS环境之外,还支持 Vue + TS开发环境的快速创建, 命令如下:

$ npm create vite@latest  vue-ts-pro -- --template vue-ts 

说明:

  1. npm create vite@latest 基于最新版本的vite进行项目创建
  2. vue-ts-pro 项目名称
  3. – --template vue-ts 选择Vue + TS的开发模板

2. 和.vue文件相关的工具

开发阶段

  1. Vue Language Features (Volar)工具对.vue文件进行实时的类型错误反馈
  2. TypeScript Vue Plugin (Volar) 工具用于支持在 TS 中 import *.vue 文件

打包阶段
vue-tsc工具负责打包时最终的类型检查
在这里插入图片描述

好处:开发阶段的类型提示交给IDE做,保证vite的运行速度,打包阶段做’兜底类型校验’,确保类型无误

为Ref标注类型

1. 场景和好处

为ref标注类型之后,既可以在给ref对象的value赋值时校验数据类型,同时在使用value的时候可以获得代码提示
在这里插入图片描述

说明:本质上是给ref对象的value属性添加类型约束

2. 如何标注

ref 函数和 TS 的配合通常分为俩种情况,类型推导和泛型指定类型

  1. 如果是简单的数据,推荐使用类型推导
    在这里插入图片描述

  2. 如果是较复杂的数据,通过泛型指定类型
    在这里插入图片描述

3. 思考题

标注ref函数类型,可以满足把下图所示的数据赋值给value属性
在这里插入图片描述

<script setup lang="ts">
import { ref } from 'vue'

type Item = {
  id: string
  name: string
  age: number
}
const list = ref<Item[]>([])
list.value = [
  { id: '1', name: 'lxx', age: 19 },
  { id: '2', name: 'lss', age: 15 }
]
</script>

<template>
  <div v-for="item in list" :key="item.id">{{ item.name + ' : ' + item.age }}</div>
</template>

<style scoped></style>

为computed标注类型

1.如何进行类型标注

计算属性通常由已知的响应式数据计算得到,所以依赖的数据类型一旦确定通过自动推导就可以知道计算属性的类型另外根据最佳实践,计算属性多数情况下是只读的,不做修改,所以配合TS一般只做代码提示

const count = ref(0)
const doubleCount = computed(() => count.value * 2)

鼠标放在doubleCount可以得到推导结果

const doubleCount:ComputedRef<number>

2.更复杂的例子

需求:给ref函数标注类型,接收后端返回的对象列表,然后使用计算属性做过滤计算,计算得到单价大于500的商品

<script setup lang="ts">
import { computed, ref } from 'vue'
const data = [
  { id: '1001', name: '男鞋', price: 888 },
  { id: '1002', name: '女鞋', price: 232 },
  { id: '1003', name: '童鞋', price: 333 }
]

type Item = {
  id: string
  name: string
  price: number
}

const list = ref<Item[]>(data)
const filterList = computed(() => list.value.filter(item => item.price > 500))
</script>

<template>
  {{ list }}
  <hr />
  {{ filterList }}
</template>

<style scoped></style>

list的类型为:
const list: Ref<{
    id: string;
    name: string;
    price: number;
}[]>
      
filterList推导出的类型为:
const filterList: ComputedRef<{
    id: string;
    name: string;
    price: number;
}[]>

为事件处理函数标注类型

1. 为什么需要标注类型

原生dom事件处理函数的参数默认会自动标注为any类型,没有任何类型提示,为了获得良好的类型提示,需要手动标注类型
在这里插入图片描述

2. 如何标注类型

  1. 给事件对象形参 e 标注为Event类型,可以获得事件对象的相关类型提示
    在这里插入图片描述

  2. 如果需要更加精确的DOM类型提示可以使用断言(as)进行操作
    在这里插入图片描述

3.思考题

如何给按钮元素button的点击事件函数标注类型?

<script setup lang="ts">
const clickHandler = (e: Event) => {
  console.log(e.target as HTMLButtonElement)
}
</script>

<template>
  <button @click="clickHandler">click</button>
</template>

<style scoped></style>

为模版引用标注类型

1. 为什么需要类型标注

给模版引用标注类型,本质上是给ref对象的value属性添加了类型约束,约定value属性中存放的是特定类型的DOM对象,从而在使用的时候获得相应的代码提示

在这里插入图片描述

2. 如何进行类型标注

通过具体的DOM类型联合null做为泛型参数, 比如我们想获取一个input dom元素
在这里插入图片描述

3. 思考题

尝试为模版引用标注类型获取一个a元素?

<script setup lang="ts">
import { onMounted, ref } from 'vue'
const aRef = ref<HTMLAnchorElement | null>(null)
onMounted(() => {
  //aRef.value存放的数据在组件渲染完毕之前是null
  //渲染完毕之后才是真实的dom
  // 可选链.?
  console.log(aRef.value?.href)
})
</script>

<template>
  <a href="#" ref="aRef">xxx</a>
</template>

<style scoped></style>

对象的非空值处理

1. 空值场景说明

当对象的属性可能是 null 或 undefined 的时候,称之为“空值”,尝试访问空值身上的属性或者方法会发生类型错误
在这里插入图片描述

说明:inputRef变量在组件挂载完毕之前,value属性中存放的值为null,不是input dom对象,通不过类型校验

2. 可选链方案

可选链 ?. 是一种访问嵌套对象属性的安全的方式, 可选链前面的值为 undefined 或者 null时,它会停止运算
在这里插入图片描述

3. 逻辑判断方案

通过逻辑判断,只有有值的时候才继续执行后面的属性访问语句
在这里插入图片描述

4. 非空断言方案

非空断言(!)是指我们开发者明确知道当前的值一定不是null或者undefined,让TS通过类型校验
在这里插入图片描述

特别注意: 使用非空断言要格外小心,它没有实际的JS判断逻辑,只是通过了TS的类型校验,容易直接把空值出现在实际的执行环境里

为组件的Props标注类型

1. 为什么给Props标注类型

给组件的Props标注类型有俩个作用,一个是确保传递的prop是类型安全的,另一个在组件内部使用的时候也会有类型提示
在这里插入图片描述

在这里插入图片描述

2. 基础使用

语法:通过defineProps宏函数对组件props进行类型标注
需求:按钮组件有俩个prop参数,color类型为string且为必填,size类型为string且为可选,怎么定义类型?
在这里插入图片描述

说明:按钮组件传递prop属性的时候必须满足color是必传项且类型为string, size为可选属性,类型为string

3. Props默认值设置

场景:Props中的可选参数通常除了指定类型之外还需要提供默认值,可以使用withDefaults宏函数来进行设置
需求:按钮组件的size属性的默认值设置为 middle
在这里插入图片描述

说明:如果用户传递了size属性,按照传递的数据来,如果没有传递,则size值为 ’middle’

4. 思考题

给按钮组件添加一个btnType属性,类型为 ’success‘, ‘danger’ 或者 ’warning‘ 三选一, 默认值为 ’success‘

<script setup lang="ts">
import MyButton from './components/MyButton.vue'
</script>

<template>
  <MyButton btn-type="success"></MyButton>
  <MyButton></MyButton>
</template>

<style scoped></style>

MyButton子组件

<script setup lang="ts">
type Props = {
  btnType?: 'success' | 'danger' | 'warning'
}

const props = withDefaults(defineProps<Props>(), {
  btnType: 'success'
})

console.log(props.btnType)
</script>

<template></template>

<style scoped></style>

为组件的emits标注类型

1. 为什么需要标注类型

在这里插入图片描述

作用:可以约束事件名称并给出自动提示,确保不会拼写错误,同时约束传参类型,不会发生参数类型错误

2. 何为组件的emits标注类型

语法:通过 defineEmits 宏函数进行类型标注
需求:子组件触发一个名称为 ’get-msg‘ 的事件,并且传递一个类型为string的参数
在这里插入图片描述

<script setup lang="ts">
import MyButton from './components/MyButton.vue'

const getMesageHandler = (e: string) => console.log(e)
</script>

<template>
  <MyButton @get-msg="getMesageHandler"></MyButton>
</template>

<style scoped></style>
<script setup lang="ts">
//定义事件类型Emits
type Emits = { 
    // 事件名称		事件参数类型
    (e: 'get-msg', msg: string): void 
}
//给emits标注类型
const emits = defineEmits<Emits>()
</script>

<template>
  <!-- 触发自定义事件 -->
  <button @click="emits('get-msg', 'xxx')">按钮</button>
</template>

<style scoped></style>

3. 思考题

Son组件再触发一个事件’get-list’, 传递参数类型为下图所示的数据类型
在这里插入图片描述

<script setup lang="ts">
import Son from './components/Son.vue'

type Item = {
  id: number
  name: string
}
const getListHandler = (e: Item[]) => e.forEach(item => console.log(item.id + ':' + item.name))
</script>

<template>
  <Son @get-list="getListHandler"></Son>
</template>

<style scoped></style>
<script setup lang="ts">
type Item = {
  id: number
  name: string
}
type Emits = { (e: 'get-list', msg: Item[]): void }
const emits = defineEmits<Emits>()

const clickHandler = () => {
  const list = [
    { id: 1001, name: 'lxx' },
    { id: 1002, name: 'kobe' }
  ]
  emits('get-list', list)
}
</script>

<template>
  <button @click="clickHandler">按钮</button>
</template>

<style scoped></style>

类型声明文件

1. 什么是类型声明文件

概念:在TS中以d.ts为后缀的文件就是类型声明文件,主要作用是为js模块提供类型信息支持,从而获得类型提示
在这里插入图片描述

说明:

  1. d.ts是如何生效的?
    在使用js某些模块的时候,TS会自动导入模块对应的d.ts文件,以提供类型提示
  2. d.ts是怎么来的?
    库如果本身是使用TS编写的,在打包的时候经过配置自动生成对应的d.ts文件(axios本身就是TS编写的)

2. 使用 DefinitelyTyped 提供类型声明文件

场景:有些库本身并不是采用TS编写的,无法直接生成配套的d.ts文件,但是也想获得类型提示,此时需要 Definitely Typed 提供类型声明文件
在这里插入图片描述

DefinitelyTyped是一个TS类型定义的仓库,专门为JS编写的库可以提供类型声明,比如可以安装 @types/jquery 为jquery提供类型提示
在这里插入图片描述

3. TS内置类型声明文件

TS为JS运行时可用的所有标准化内置API都提供了声明文件,这些文件既不需要编译生成,也不需要三方提供

在这里插入图片描述

说明:这里的lib.es5.d.ts以及lib.dom.d.ts都是内置的类型声明文件,为原生js和浏览器API提供类型提示

4. 自定义类型声明文件

d.ts文件在项目中是可以进行自定义创建的,通常有俩种作用,第一个是共享TS类型(重要),第二种是给js文件提供类型(了解)

场景一:共享TS类型

在这里插入图片描述

说明:哪个业务组件需要用到类型导入即可,为了区分普通模块,可以加上type关键词

场景二:给JS文件提供类型
在这里插入图片描述

说明:通过declare关键词可以为js文件中的变量声明对应类型,这样js导出的模块在使用的时候也会获得类型提示

5. .ts文件和d.ts文件对比

TS中有俩种文件类型,一种是.ts文件,一种是.d.ts文件
.ts文件

  1. 既可以包含类型信息也可以写逻辑代码
  2. 可以被编译为js文件

.d.ts文件

  1. 只能包含类型信息不可以写逻辑代码
  2. 不会被编译为js文件,仅做类型校验检查

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1112760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux搭建文件服务器

搭建简单文件服务器 基于centos7.9搭建http文件服务器基于centos7.9搭建nginx文件服务器基于ubuntu2204搭建http文件服务器 IP环境192.168.200.100VMware17 基于centos7.9搭建http文件服务器 安装httpd [rootlocalhost ~]# yum install -y httpd关闭防火墙以及selinux [roo…

【Qt-20】Qt信号与槽

一、什么是信号和槽 信号是特定情况下被发射的事件&#xff0c;发射信号使用emit关键字&#xff0c;定义信号使用signals关键字&#xff0c;在signals前面不能使用public、private、protected等限定符&#xff0c;信号只用声明&#xff0c;不需也不能对其进行定义实现。另外&am…

【Jetson 设备】window10主机下使用VNC可视化控制Jetson Orin NX

文章目录 前言VNC连接搭建(WiFi模式)Jetson Orin NX操作本地主机操作 VNC连接搭建(以太网模式)Jetson Orin NX操作本地主机操作 总结 前言 最近需要使用Jetson Orin NX对一些深度学习算法进行测试&#xff0c;为了方便主机与Jetson Orin NX之间的数据的传输&#xff0c;以及方…

MATLAB - 不能使用PYTHON,缺少matplotlib模块的解决办法

matlab缺少python-matplotlib模块的解决办法 1. 前言、概述2. 解决办法3. 可能出现问题4. 结果 1. 前言、概述 起因是我用习惯的colormap函数getPyPlot_cMap不能用了&#xff1a;【这个函数要调用PYTHON】 报错的地方&#xff1a; ModuleNotFoundError: No module named ‘ma…

html中公用css、js提取、使用

前言 开发中&#xff0c;页面会有引用相同的css、js的情况&#xff0c;如需更改则每个页面都需要调整&#xff0c;重复性工作较多&#xff0c;另外在更改内容之后上传至服务器中会有缓存问题&#xff0c;特针对该情况对公用css、js进行了提取并对引用时增加了版本号 一、提取…

微信小程序开发之会议OA的会议界面,投票界面

一、自定义组件 1&#xff0c;自定义组件介绍 从小程序基础库版本 1.6.3 开始&#xff0c;小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。 开发者可以将页面内的功能模块抽象成自定义组件&#xff0c;以便在不同的页面中重复使用&#xf…

grpc实现跨语言(go与java)服务通信

Golang微服务实战&#xff1a;使用gRPC实现跨语言通信&#xff01;随着微服务架构的发展&#xff0c;越来越多的企业开始采用微服务架构来构建分布式系统。在微服务架构中&#xff0c;服务之间的通信是非常重要的。而gRPC作为一种高效、跨平台、跨语言的RPC框架&#xff0c;成为…

小目标检测闲谈

学术界在小目标检测领域的研究进展似乎已经相对缓慢&#xff0c;这一趋势在年度顶级学术会议的相关论文中也有所体现。这部分停滞可能与深度学习领域整体的发展趋势有关。然而&#xff0c;小目标检测仍然是一个具有重要应用潜力的领域&#xff0c;尤其在实际部署中&#xff0c;…

ChatGPT(1):ChatGPT初识

1 ChatGPT原理 ChatGPT 是基于 GPT-3.5 架构的一个大型语言模型&#xff0c;它的工作原理涵盖了深度学习和自然语言处理技术。以下是 ChatGPT 的工作原理的一些关键要点&#xff1a; 神经网络架构&#xff1a;ChatGPT 的核心是一个深度神经网络&#xff0c;采用了变种的 Tran…

1 tcp协议20问

1什么是TCP网络分层 1.1分层描述 网络访问层&#xff1a; 2 TCP的三次握⼿中为什么是三次&#xff1f;为什么不是两次、四次&#xff1f; 两次握手的话&#xff0c;服务端会单方面认为建立已经成功&#xff0c;但是对于客户端而言&#xff0c;可能只是开个玩笑的&#xff0c…

形式化验证笔记

参考视频&#xff1a; 形式化验证的原理与新应用【DatenLord达坦科技】形式化验证入门(我强推&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;) 形式化验证&#xff1a;在状态机表征的空间里面进行搜索&#xff0c;验证某个模型是否按规范执行且测试覆盖率达到1…

058:mapboxGL监听键盘事件,通过panBy控制前后左右移动

第058个 点击查看专栏目录 本示例是介绍演示如何在vue+mapbox中监听键盘事件,控制前后左右移动。 本例通过panBy方法来移动一定距离的地图,通过.addEventListener的方法来监听键盘的按键动作。注意这里面style中一定要设置好pitch,不能为0,不然就撞墙,不能移动了。 直接复…

OpenCV 笔记(2):图像的属性以及像素相关的操作

Part11. 图像的属性 11.1 Mat 的主要属性 在前文中&#xff0c;我们大致了解了 Mat 的基本结构以及它的创建与赋值。接下来我们通过一个例子&#xff0c;来看看 Mat 所包含的常用属性。 先创建一个 3*4 的四通道的矩阵&#xff0c;并打印出其相关的属性&#xff0c;稍后会详细…

数据库索引种类

文章目录 索引的优缺点优点缺点 聚簇索引特点优点缺点 非聚簇索引特点优点缺点使用场景&#xff1a; 在MyISAM与InnoDB中的使用 索引的优缺点 索引概述 MySQL官方将索引定义为帮助MySQL高效获取数据的数据结构。索引的本质是一种排好序的快速查找数据结构&#xff0c;用于满足…

YOLOv5/v7/v8改进实验(五)之使用timm更换YOLOv5模型主干网络Backbone篇

&#x1f680;&#x1f680; 前言 &#x1f680;&#x1f680; timm 库实现了最新的几乎所有的具有影响力的视觉模型&#xff0c;它不仅提供了模型的权重&#xff0c;还提供了一个很棒的分布式训练和评估的代码框架&#xff0c;方便后人开发。更难能可贵的是它还在不断地更新迭…

(H5轮播)vue一个轮播里显示多个内容/一屏展示两个半内容

效果图 : html: <div class"content"><van-swipeclass"my-swipe com-long-swipe-indicator":autoplay"2500"indicator-color"#00C4FF"><van-swipe-itemclass"flex-row-wrap"v-for"(items, index) in M…

Kubernetes 进阶

Kubernetes 进阶  Service 控制器  Ingress 对象(对外暴露应用)  管理应用程序配置  K8s 数据卷与持久数据卷  再谈有状态应用部署:StatefulSet控制器  K8s 安全访问控制  K8s 部署利器Helm初探 Service 控制器 • Service存在的意义 • Pod与…

更改Kali Linux系统语言以及安装zenmap

目录 更改Kali Linux系统语言 安装 Zenmap 更改Kali Linux系统语言以及安装zenmap 在使用kali的过程中&#xff0c;会遇到许多问题&#xff0c;其中一个就是看不懂英语&#xff0c;下面是如何更换语言的步骤。 更改Kali Linux系统语言 首先&#xff0c;打开kali&#xff0…

学信息系统项目管理师第4版系列32_信息技术发展

1. 大型信息系统 1.1. 大型信息系统是指以信息技术和通信技术为支撑&#xff0c;规模庞大&#xff0c;分布广阔&#xff0c;采用多级 网络结构&#xff0c;跨越多个安全域&#xff1b;处理海量的&#xff0c;复杂且形式多样的数据&#xff0c;提供多种类型应用 的大系统 1.1.…

python安装、输入输出、注释、中文编码、编码规范等基础语法

一、概述 1、简介 Python的创始人为吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;。1989年的圣诞节期间&#xff0c;Guido开始写Python语言的编译器。Python这个名字&#xff0c;来自Guido所挚爱的电视剧Monty Python’s Flying Circus。他希望这个新的叫做Python的…