vue3 使用typescript小结
最近学习vue3 typescript,网上看了很多文章,汇总一下,分享给大家,希望会对大家有帮助。
一. 为props标注类型
defineProps()宏函数支持从它的参数中推导类型:
<script setup lang='ts'>import { defineProps } from 'vue'//运行时声明const props=defineProps({foo:{ type:String,required:true },bar: {type:Number}})//stringconst foo:string=props.foo// number | undefunedconst bar:number|undefined=props.bar</script>
这被称为运行时声明,传递给defineProps的参数作为运行时的props选项使用,推断出类型。
第二种方式,通过泛型参数来定义props的类型,这种方式更加直接:
<script setup lang='ts'>
import { defineProps } from 'vue'const props=defineProps<{foo:string,bar?:number
}>();//orinterface Props {foo:stringbar?:number
}const props2=defineProps<Props>()//string
const foo:string=props2.foo;
//number | undefined
const bar:number|undefined=props2.bar
</script>
这种被称为“基于类型声明”,编译器会尽可能的尝试根据类型参数推导出等价的运行时选项。这种方式不足之处在于,失去了定义props默认值的能力。为了解决这个问题,我们可以使用withDefaults编译器宏:
<script setup lang='ts'>
import { defineProps } from 'vue'interface Props {msg:stringlabels:string[]
}const props=withDefaults(definedProps<Props>(), {msg:'zhangsan',labels:['a','b']}</script>
上面代码会被编译为等价的运行时props的default选项。
二. 为emits标注类型
emit函数的类型标注也可以使用运行时声明或基于类型的声明:
<script setup lang='ts'>
import { defineEmits } from 'vue'//运行时
const emits=defineEmits({'changeEmit','updateEmit'})emits('changeEmit',5,'data')//基于类型
const emits=defineEmits<{
(e:'changeEmit',id:number,data:string):void
(e:'updateEmit',value:string):void
}>();</script>
我们可以看到,基于类型声明,可以使我们对所触发的事件的类型进行更细粒度的控制。
三. 为ref()标注类型
默认推倒类型
ref会根据初始化时的值自动推导其类型:
<script setup lang='ts'>
import { ref } from 'vue'const year=ref(2023)//TS Error:不能将类型sting分配给类型
//number
year.value='2023'</script>
通过接口指定类型:
<script setup lang='ts'>
import { ref } from 'vue'
import type { Ref } from 'vue'const year:Ref<string|number>=ref(2023)
//success
year.value='2023'//or 通过泛型指定类型
const year1=ref<string|number>=ref(2023)
//success
year1.value=2023//未指定初始值
const year2=ref<string|number|undefined>()
//success
year2.value=2023
year2.value='2023'
</script>
注意:如果你指定了一个泛型参数但没有给出初始值,那么最后得到的就是一个包含undefined的联合类型。
四. 为reactive标准类型
默认推导类型
reactive也会隐式的从它的参数中推导出类型:
<script setup lang='ts'>
import { reactive } from 'vue'cost temp=reactive({title:'为vue3做标注'
})//error number
temp.title=2023
//success string
temp.tilte='abc'
</script>
通过接口指定类型
要显式的指定一个reactive变量的类型,我们可以使用接口:
<script setup lang='ts'>
import { reactive } from 'vue'interface Book {tilte:stringyear?:number
}const book:Book=reactive({title:'程序员的自我修养'})
//or
// const book=reactive<Book>({title:'程序员的自我修养'})
//sucess
book.year=2023</script>
五. 为computed()标注类型
默认推导类型
computed()会自动从其计算函数的返回值上推导类型:
<script setup lang='ts'>
import { ref,computed } from 'vue'const count=ref(0)//推导得到类型:ComputedRef<number>
const double=computed(()=> count.value * 2)//TS Error:Property 'split' does not exist on type
//number
const result=double.value.split('')</script>
通过泛型指定类型
你还可以通过泛型参数显式指定类型:
<script setup lang='ts'>
import { ref,computed } from 'vue'
import type { Ref } from 'vue'const count:Ref<sting>=ref(0)const double=computed<number>(()=> count.value * 2 )</script>
六:为事件处理函数标注类型
在处理原生DOM事件时,应该给时间处理函数的参数正确地标注类型:
<script setup lang='ts'>function handleChange(event) {//event 隐性的标注为 any 类型console.log(event.target.value)
}</script><template><input type='text' @change='handleChange'/>
</template>
当没有类型标注时,这个event参数会隐性的标注为any类型。这也会在tsconfig.json中配置了“strict”:true 或 "noImplicitAny":true时报出一个ts错误。因此,建议显示的为事件处理函数的参数标注类型。此外,你可能需要显式的强制转换event上的属性:
<script setup lang='ts'>function handleChange(event:Event):void
{console.log((event.target as HTMLInputElement).value)
}</script><template><input type='text' @change='handleChange'/>
</template>
七:为provide/inject标注类型
provide和inject 通常会在不同的组件中运行。要正确的为注入的值标注类型,Vue提供了一个InjectKey类型,它是一个继承自Symbol的泛型类型,可以用来在提供者和消费者之间同步植入值的类型。
<script setup lang='ts'>
import { provide,inject } from 'vue'
import type { InjectionKey } from 'vue'const key=Symbol as InjectionKey<string>//若提供的是非字符串值会导致错误
provide(key,'foo')//foo的类型:string | undefind
const foo=inject(key)</script>
建议将注入的key的类型保存在一个单独的文件中,这样它就可以被多个组件导入。
当使用字符串注入key时,注入值的类型是unkown,需要通过泛型参数显式的声明:
<script setup lang='ts'>
import { inject } from 'vue'//foo的类型:string | undefined
const foo=inject<string>('key')</script>
注意:注入的值仍然可以是undefined,因为无法保证提供者一定会在运行时提供provide这个值。当提供了一个默认值后,这个undefined的类型就可以被移除。
<script setup lang='ts'>
import { inject } from 'vue'//类型 string
const foo=inject<string>('key','foo')</script>
如果你确定该值始终被提供,则可以强制转化该值。
<script setup lang='ts'>
import { inject } from 'vue'const foo=inject('key') as string</script>
八. 为组件模板引用标注类型
有时,我们需要为一个子组件添加一个模板ref,以便调用它公开的方法。比如:我们有一个MyComponent子组件,它有一个打开的模态框的方法:
<script setup lang='ts'>
import {ref,defineExpose} from 'vue'const isContentShown=ref(0)
const open=()=> isContentShown.value===truedefineExpose({open
})</script>
为了获取MyComponent的类型,我们首先需要通过typeof得到其类型,再使用TypeScript内置的InstanceType工具类型来获取其实例类型。
//pranet.vue
<script setup lang='ts'>
import MyComponent from './MyComponent.vue'const modal=ref<InstanceType<typeof MyComponent > | null>(null)const openModal=()=> modal.value?.open()
</script>
相关文章:
vue3 使用typescript小结
最近学习vue3 typescript,网上看了很多文章,汇总一下,分享给大家,希望会对大家有帮助。 一. 为props标注类型 defineProps()宏函数支持从它的参数中推导类型: <script setup langts>import { defineProps } fro…...

PYTHON爬虫基础
一、安装package 在使用爬虫前,需要先安装三个包,requests、BeautifulSoup、selenium。 输入如下代码,若无报错,则说明安装成功。 import requests from bs4 import BeautifulSoup import selenium二、Requests应用 了解了原理…...

JavaScript刷LeetCode模板技巧篇(一)
虽然很多人都觉得前端算法弱,但其实 JavaScript 也可以刷题啊!最近两个月断断续续刷完了 leetcode 前 200 的 middle hard ,总结了一些刷题常用的模板代码。 常用函数 包括打印函数和一些数学函数。 const _max Math.max.bind(Math); co…...

ros-sensor_msgs/PointCloud2消息内容解释
1.字段解释 header-----头文件,包含消息的序列号,时间戳(系统时间)和坐标系id,其中secs为秒,nsecs为去除秒数后剩余的纳秒数 height-----点云的高度,如果是无序点云,则为1,例子中的点云为有序点…...

LeetCode 每日一题2347. 最好的扑克手牌
Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…...

MMPBSA计算--基于李继存老师gmx_mmpbsa脚本
MMPBSA计算–基于李继存老师gmx_mmpbsa脚本 前期准备 软件安装 安装gromacs, 可以查阅 我的blogGromacs-2022 GPU-CUDA加速版 unbantu 安装 apbs, sudo apt install apbs 安装 gawk, sudo apt install gawk MD模拟好的文件 我们以研究蛋白小分子动态相互作用-III(蛋白配体…...

Kafka优化篇-压测和性能调优
简介 Kafka的配置详尽、复杂,想要进行全面的性能调优需要掌握大量信息,这里只记录一下我在日常工作使用中走过的坑和经验来对kafka集群进行优化常用的几点。 Kafka性能调优和参数调优 性能调优 JVM的优化 java相关系统自然离不开JVM的优化。首先想到…...

MinIo-SDK
3.2.5 SDK 3.2.5.1上传文件 MinIO提供多个语言版本SDK的支持,下边找到java版本的文档: 地址:https://docs.min.io/docs/java-client-quickstart-guide.html 最低需求Java 1.8或更高版本: maven依赖如下: XML<dependency&g…...
系统分析师真题2018试卷相关概念一
面向对象的基本概念: 对象的三要素为:属性(数据)、方法(操作)、对象ID(标识)UML2.0包括14种图: 类图(class diagram):类图描述一组类、接口、协作和他们之间的关系。在OO系统的建模中,最常见的图就是类图。类图给出了系统的静态设计图,活动类的类图给出了系统的静…...

身为大学生,你不会还不知道有这些学生福利吧!!!!
本文介绍的是利用学生身份可以享受到的相关学生优惠权益,但也希望各位享受权利的同时不要忘记自己的义务,不要售卖、转手自己的学生优惠资格,使得其他同学无法受益。 前言 高考已经过去,我们也将迎来不同于以往的大学生活&#x…...
试题 算法训练 藏匿的刺客
问题描述 强大的kAc建立了强大的帝国,但人民深受其学霸及23文化的压迫,于是勇敢的鹏决心反抗。 kAc帝国防守森严,鹏带领着小伙伴们躲在城外的草堆叶子中,称为叶子鹏。 kAc帝国的派出的n个看守员都发现了这一问题ÿ…...

JavaWab开发的总括以及HTML知识
一、Web开发的总括在这里我来给大家介绍一下Wab开发需要配合哪些前后端的对应语言:首先是Java(Java通常的工作):Wab开发android开发大数据开发另外,Wab开发想要学好就需要配合之前博客中的内容,如:多线程/IO/网络/数据结构/数据库......这里建议学懂前面的内容再往下走.JavaWab…...
Oracle数据库文件(*.dbf)迁移【图文教程】
目录 背景 解决 第1步:sqlplus登录 第2步:查看Oracle数据文件所在目录 第3步:修改表空间为离线状态 第4步: 移动数据库文件到新目录 第5步:修改表空间数据文件位置 第6步:修改表空间为online状态 第7步:临时表空间处理 第8步:验证修改是否成功 参考...

Java中如何创建和使用对象?
要想使用一个类则必须要有对象。在Java程序中可以使用new关键字创建对象,具体格式如下:类名对象名称null; 对象名称new 类名();上述格式中,创建对象分为声明对象和实例化对象两步,也可以直接通过下面的方式创建对象,具…...

Spring Cloud Alibaba--ActiveMQ微服务详解之消息队列(四)
上篇讲述高并发情况下的数据库处理方式:分布式事务管理机制。即使我们做到这一步并发情况只能稍微得到缓解,当然千万级别的问题不大,但在面对双十一淘宝这类的达上亿的并发的时候仅仅靠分布式事务管理还是远远不够,即使数据库可以…...

32岁,薪水被应届生倒挂,裸辞了
今年 32 岁,我从公司离职了,是裸辞。 前段时间,我有一件事情一直憋在心里很难受,想了很久也没找到合适的人倾诉,就借着今天写出来。 我一个十几年开发经验,八年 软件测试 经验的职场老人,我慢…...

蓝桥杯训练day1
前缀和差分1.前缀和(1)3956. 截断数组(2)795. 前缀和(3)796. 子矩阵的和(4)1230. K倍区间(5)99. 激光炸弹2.差分(1)797. 差分(2)差分矩阵(3)3729. 改变数组元素(4)100. 增减序列1.前缀和 (1)3956. 截断数组 方法1:暴力 先用两个数组分别保存前缀和,后缀…...

Unity毛发系统TressFX Exporter
Unity 数字人交流群:296041238 一:在Maya下的TressFX Exporter 插件安装步骤: 1. 下载Maya的TressFX Exporter插件 下载地址:TressFX Exporter 链接:https://github.com/Unity-China/cn.unity.hairfx.core/tree/m…...

《爆肝整理》保姆级系列教程python接口自动化(十九)--Json 数据处理---实战(详解)
简介 上一篇说了关于json数据处理,是为了断言方便,这篇就带各位小伙伴实战一下。首先捋一下思路,然后根据思路一步一步的去实现和实战,不要一开始就盲目的动手和无头苍蝇一样到处乱撞,撞得头破血流后而放弃了。不仅什么…...
Golang:reflect反射的使用例子
1.reflect包作用 reflect包定义了“反射”相关能力,“反射”在计算机学中是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。基于反射特性可以通用化地解决一些需要频繁修改代码及硬编码问题,但是…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...