当前位置: 首页 > news >正文

Vue3 + TypeScript

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: stringname: stringage: 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: stringname: stringprice: 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: numbername: 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: numbername: 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文件,仅做类型校验检查

相关文章:

Vue3 + TypeScript

Vue3 TS开发环境创建 1. 创建环境 vite除了支持基础阶段的纯TS环境之外&#xff0c;还支持 Vue TS开发环境的快速创建, 命令如下&#xff1a; $ npm create vitelatest vue-ts-pro -- --template vue-ts 说明&#xff1a; npm create vitelatest 基于最新版本的vite进行…...

软件测试/测试开发丨南科大计算机系本科生获“火焰杯”软件测试高校就业选拔赛一等奖

2022年12月2日&#xff0c;计算机系党总支书记、副系主任王琦副教授在工学院南楼551会议室为19级徐驰同学颁发第二届“火焰杯”软件测试开发选拔赛一等奖奖项&#xff0c;为刘烨庞助理教授颁发赛事优秀指导老师奖项。徐驰同学于2022年4月获得该赛事全国总决赛第一名&#xff0c…...

访问 github 问题解决方法

一、macOS版 PS. Windows 版的还没试&#xff0c;不过应该也差不多 1.基本信息 硬件&#xff1a;MacBook Pro 2017 (A1707) 系统&#xff1a;macOS 13.6 (Ventura) 应用&#xff1a;SwitchHosts 4.1.2 (Releases oldj/SwitchHosts GitHub) hosts内容网站&#xff1a;ht…...

供应QCA8075原装芯片

长期供应各品牌原装芯片&#xff1a; SST39VF040-70-4I-NH AR9344 DC3A BGA USB2422 QFN24 W9751G6KB-251 RTL8211EG-VB-CG HI3535-RBCV100 MX25L25635FMI-10G USB2240I-AEZG EM620FV8BS-70LF HXI15H4G160AF-13K 1PQ8064/BGA-519 USB4604I-1080HN SCB15H2G160A…...

在Maven中配置代理服务器的详细教程

在Maven中配置代理服务器的详细教程如下&#xff1a; 首先&#xff0c;确保您已经安装了Maven。创建一个新的Maven项目。在命令行中输入以下命令&#xff1a; mvn archetype:generate -DgroupIdcom.example -DartifactIdmy-app -DarchetypeArtifactIdmaven-archetype-quickst…...

QStringListModel

创建模型&#xff1a; QStringListModel* model new QStringListModel(this); 初始化列表&#xff1a; QStringList strList;strList << QStringLiteral("北京") << QStringLiteral("上海") << QStringLiteral("天津") &l…...

Linux下的文件管理

一、Linux下文件命名规则 1、可以使用哪些字符&#xff1f; 理论上除了字符“/”之外&#xff0c;所有的字符都可以使用&#xff0c;但是要注意&#xff0c;在目录名或文件名中&#xff0c;不建议使用某些特殊字符&#xff0c;例如&#xff0c; <、>、&#xff1f;、* …...

RN:报错info Opening flipper://null/React?device=React%20Native

背景 在 ios 上使用 debug 模式的时候&#xff0c;报错&#xff1a;info Opening flipper://null/React?deviceReact%20Native&#xff0c;我找到了这个 issue 其实也可以看到现在打开 debug&#xff0c;是 open debug&#xff0c;也不是之前的 debug for chrome 了&#xf…...

请问嵌入式或迁移学习要学什么?

请问嵌入式或迁移学习要学什么&#xff1f; 学习嵌入式和迁移学习是一个很好的方向&#xff0c;尤其是在军I领域。以下是一些你可以提前学习的基本 知识和步骤: 嵌入式系统:最近很多小伙伴找我&#xff0c;说想要一些嵌入式资料&#xff0c;然后我根据自己从业十年经验&#…...

数据结构-----图(Graph)论必知必会知识

目录 前言 图的基本概念 1.什么是图&#xff1f; 2 .图的相关术语 3 .有向图和无向图 4.简单图和多重图 5.连通图、强连通图、非连通图 6.权与网 7.子图和(强)连通分量 8.生成树和生成森林 前言 今天我们学习一种新的数据结构-----图&#xff0c;大家在日常生活中经常都…...

外汇天眼:法国金融市场管理局(AMF)致力于向零售投资者提供有关金融产品费用的信息

法国金融市场管理局&#xff08;AMF&#xff09;已经发布了一份专为专业人士准备的指南&#xff0c;以便他们使用更易于理解和比较的术语&#xff0c;以帮助客户更好地理解和比较费用。 AMF在其网站上推出了一个新的费用信息栏目&#xff0c;提供教育内容和工具&#xff0c;帮…...

【PythonGIS】基于Python批量合并矢量数据

老样子最近有项目需要将N个矢量文件合并成一个&#xff0c;总不能用ArcGIS一个个导入吧。所以我就想着用Python编个程序实现批量合并矢量。我之前也发了一些关于Python操作矢量数据的文章&#xff1a;【Python&GIS】Python处理矢量数据的基本操作&#xff08;查询、修改、删…...

精益求精:使用Ansible集中式自动备份核心数据

1、引言 在当今数字化时代&#xff0c;数据是企业和组织的核心资产。为了确保数据的安全性和可恢复性&#xff0c;备份是至关重 要的。然而&#xff0c;手动备份数据可能会繁琐且容易出错&#xff0c;特别是在面对大规模和分布式的数据存储情况下。幸运的是&#xff0c;Ansibl…...

大数据高级面试题

大数据高级面试题 Kafka的producer如何实现幂等性? Producer 幂等性 Producer 的幂等性指的是当发送同一条消息时&#xff0c;数据在 Server 端只会被持久化一次&#xff0c;数据不丟不重&#xff0c;但是这里的幂等性是有条件的&#xff1a; 只能保证 Producer 在单个会话内…...

如何拦截响应内容并修改响应头

背景及需求描述 背景 记录分享下近期遇到并解决的困扰了比较久的问题&#xff1a;在不同系统微信生态发现同一个cos地址用window.open(url)打开在苹果和安卓设备的微信生态上表现不一致&#xff1a;对于文档类型&#xff0c;响应头Content-Type: application/pdf 在安卓微信上…...

分类预测 | Matlab实现WOA-GRU鲸鱼算法优化门控循环单元的数据多输入分类预测

分类预测 | Matlab实现WOA-GRU鲸鱼算法优化门控循环单元的数据多输入分类预测 目录 分类预测 | Matlab实现WOA-GRU鲸鱼算法优化门控循环单元的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-GRU鲸鱼算法优化门控循环单元的数据多输入…...

特定深度节点链表

题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 经典BFS与简单链表结合的题目。 #define MAX_DEPTH (1000)struct ListNode** listOfDepth(struct TreeNode* tree, int* returnSize) {*returnSize 0;struct ListNode **ans (…...

【css】背景换颜色

更换前 longin.html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>login</title><link href"/css/style.css" type"text/css" rel"stylesheet"><s…...

什么是美颜sdk?直播实时美颜sdk的工作流程和架构分析

在现代社交媒体和娱乐行业中&#xff0c;直播已经成为了一种受欢迎的娱乐形式&#xff0c;同时实时美颜也变得越来越重要。直播实时美颜SDK的工作流程和架构在这一领域起到了关键作用。本文将深入探讨这些SDK的内部机制&#xff0c;从而理解它们如何为用户提供出色的美颜效果。…...

第二证券:跌破3000点,热搜第一!

今天上午&#xff0c;“沪指开盘跌破3000点关口”冲上百度热搜榜榜首。 上午收盘&#xff0c;上证指数下跌0.27%&#xff0c;报2997.22点&#xff1b;深证成指下跌0.36%&#xff0c;创业板指下跌0.44%。 赛道股发力&#xff0c;光伏、风电、新能源轿车等板块盘中冲高。房地产…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...