typescipt——基础积累

1.为组件的props标注类型

场景一:使用<script setup></script>

<script setup lang="ts">
const props = defineProps({foo:{type:String,required:true},bar:Number
})
props.foo //string
props.bar //number|undefined
</script>

也可以将props的类型移入一个单独的接口中

<script setup lang="ts">
interface Props{foo:string,bar?:number
}
const props = defineProps<Props>()
</script>

场景二:不使用<script setup></script>

import {defineComponent} from 'vue';
export default defineComponent({props:{message:String},setup(props){props.message //类型:string}
})

注意点:为了生成正确的运行时代码,传给defineProps()的泛型参数必须是以下之一:

1.一个类型字面量:

defineProps<{/*...*/}>()

对同一个文件中的一个接口或对象类型字面量的引用

interface Props{/*...*/}
defineProps<Props>()

3.接口或对象字面类型可以包含从其他文件导入的类型引用,但是,传递给defineProps的泛型参数本身不能是一个导入的类型:

import {Props} from './other-file'
//不支持
defineProps<Props>()

Props解构默认值

当使用基于类型的声明时,失去了对props定义默认值的能力,通过目前实验性的响应性语法糖来解决:

<script setup lang="ts">
interface Props{foo:string,bar?:number
}
//对defineProps()的响应性解构
//默认值会被编译为等价的运行时选项
const {foo,bar=100} = defineProps<Props>()
</script>

2.为组件的emits标注类型

场景一:使用<script setup>

<script setup lang="ts">
const emit = defineEmits(['change','update']);
//基于类型
const emit = defineEmits<{(e:'change',id:number):void(e:'update',value:string):void
}>()
</script>

场景二:不使用<script setup></script>

import {defineComponent} from 'vue';
export default defineComponent({emits:['change'],setup(props,{emit}){emit('change')}
})

3.ref()标注类型

import {ref} from 'vue';
import type {Ref} from 'vue';

//1.ref会根据初始化时的值推导其类型
//推导出的类型:Ref

const year = ref(2020)
//=>TS Error:Type string is not assignable to type number
year.value = '2020'

//2.指定一个更复杂的类型,可以通过使用Ref这个类型

const year:Ref<string|number> = ref('2020');
year.value = 2020;

//3.在调用ref()时传入一个泛型参数,来覆盖默认的推导行为:
//得到的类型:Ref<string|number>

const year = ref<string|number>('2020')
year.value = 2020

//4.如果你指定了一个泛型参数但没有给出初始值,那么最后得到的就将是一个包含undefined的联合类型
//推导得到的类型:Ref<number|undefined>

const n = ref<number>()

4.为reactive()标注类型

import {reactive} from 'vue';

//1.reactive()也会隐式的从它的参数中推导类型:
//推导得到的类型:{title:string}

const book = reactive({title:'vue3 指引'})

//2.要显式的标注一个reactive变量的类型,我们可以使用接口

interface Book{title:string,year?:number
}
const book:Book = reactive({title:'vue3指引'})

5.为computed()标注类型

import {ref,computed} from 'vue';

1.computed()会自动从其计算函数的返回值上推导出类型

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('')

2.通过泛型参数显式的指定类型

const double = computed<number>(()=>{//若返回值不是number类型则会报错
})

6.为事件处理函数标注类型

在处理原生DOM事件时,应该为我们传递给事件处理函数的参数正确的标注类型

<script setup lang="ts">
function handleChange(event){//没有类型标注时 event 隐式的标注为any类型//这也会在tsconfig.json中配置了strict:true或noImplicitAny:true时报出一个TS错误console.log(event.target.value);
}
</script>
<template><input type="text" @change="handleChange"/>
</template>
//因此,建议显式的为事件处理函数的参数标注类型,需要显式的强制转换event上的属性:
function handleChange(event:Event){console.log((event.target as HTMLInputElement).value)
}

7.为provide/inject标注类型

provide和inject通常会在不同的组件中运行,要正确的为注入的值标记类型
vue提供了一个injectionKey接口,它是一个继承自symbol的泛型类型
可以用来在提供者和消费者之间同步的注入值的类型:

import {provide,inject} from 'vue';
import type {InjectionKey} from 'vue';
const key = Symbol() as InjectionKey<string>
provide(key,'foo')//若提供的是非字符串值会导致错误
const foo = inject(key)//foo 的类型:string |undefined

//建议将注入key的类型放在一个单独的文件中,这样它就可以被多个组件导入
//当使用字符串注入key时,注入值的类型是unknown,需要通过泛型参数显式声明:

cont foo = inject<string>('foo')//类型:string|undefined

//注意注入的值仍然可以是:undefined,因为无法保证提供者一定会在运行时provide这个值
//当提供了一个默认值后,这个undefined类型就可以被转移

const foo = inject<string>('foo','bar')//类型:string

//如果你确定该值将始终被提供,则还可以强制转换该值

const foo = inject('foo') as string

8.为模板引用标注类型

//模板引用需要通过一个显式指定的泛型参数和一个初始值null来创建:

<script setup lang="ts">
import {ref,onMounted} from 'vue';
const el = ref<HTMLInputElement |null>(null)
onMounted(()=>{el.value?.focus()
})
</script>

//注意为了严格的类型安全,有必要在访问el.value时使用可选链或类型守卫,这是因为直到组件被挂载前,这个ref的值都是初始的null,并且在由于v-if的行为将引用的元素写在时也可以被设置为null

<template><input ref="el"/>
</template>

9.为组件模板引用标注类型

//有时,你可能需要为一个子组件添加一个模板引用,以便调用它公开的方法,举例来说,我们有一个myModal子组件,它有一个打开模态框的方法

<!--MyModal.vue-->
<script setup lange="ts">
import {ref} from 'vue';
const isContentShown = ref(false);
const open = ()=>(isContentShown.value=true);
defineExpose({open})
</script>

//为了获取MyModal的类型,我们首先需要通过typeof得到其类型,再使用typescript内置的instanceType工具类型来获取其实例类型:

<!--App.vue-->
<script setup lang="ts">
import MyModal from './MyModal.vue'
const modal = ref<InstanceType<typeof MyModal>|null>(null)
const openModal = ()=>{modal.value?.open()
}
</script>

//注意:如果你想在typescript 文件而不是在vue sfc中使用这种技巧,需要开启volar的takeover模式

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

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

相关文章

分享VMware Workstation Pro ESXI7创建虚拟机和配置硬盘空间(分享自己的学习历程意在帮助有需要的小伙伴)

背景&#xff1a;因公司项目需求改用VMware Workstation Pro&#xff0c;已经使用1个月目前除了中途出现过一次问题被解决后一直稳定运行至今&#xff0c; 1:这里贴出拿出现的问题提示及解决方法的链接&#xff1a;解决vmWare ESXI 7.3报错; 2:如果你是第一次接触VMware Work…

Echarts 文字太长用省略号代替

xAxis: [{type: category,data: [materialUserEchartsDate.value[0] ? materialUserEchartsDate.value[0].name : ,materialUserEchartsDate.value[1] ? materialUserEchartsDate.value[1].name : ,materialUserEchartsDate.value[2] ? materialUserEchartsDate.value[2].na…

二、前端高德地图、渲染标记(Marker)引入自定义icon,手动设置zoom

要实现这个效果&#xff0c;我们先看一下目前的页面展示&#xff1a; 左边有一个图例&#xff0c;我们可以方法缩小地图&#xff0c;右边是动态的marker标记&#xff0c;到时候肯定时候是后端将对应的颜色标识、文字展示、坐标点给咱们返回、我们肯定可以拿到一个list&#xf…

Future模式

目录 1.作用 2.Java中Future模式的实现 3.Future接口的主要实现类 1.FutureTask 2.CompletableFuture 1.作用 在执行耗时较长任务的场景下&#xff0c;通过Future模式能够进行异步调用&#xff1a;即将该耗时任务通过子线程异步执行&#xff0c;而主程序执行其他任务&…

乐观锁和悲观锁

前言 最近跟别人沟通聊到&#xff0c;乐观锁和悲观锁问题&#xff0c;是出现频率比较高的面试题。我对这方面还没吃透&#xff0c;故直接把大大的文章搬过来了&#xff0c;谢谢大大&#xff01; 转载&#xff1a;详解乐观锁和悲观锁_Allen Chou的博客-CSDN博客 一、基本概念 …

【广州华锐互动】无人值守变电站AR虚拟测控平台

无人值守变电站AR虚拟测控平台是一种基于增强现实技术的电力设备巡检系统&#xff0c;它可以利用增强现实技术将虚拟信息叠加在真实场景中&#xff0c;帮助巡检人员更加高效地完成巡检任务。这种系统的出现&#xff0c;不仅提高了巡检效率和准确性&#xff0c;还降低了巡检成本…

企业级敏捷转型探索与实践︱极狐Gitlab战略运营部PMO郝韫

极狐Gitlab战略运营部PMO郝韫先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;企业级敏捷转型探索与实践。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 打造持续创新、快速成长的敏捷组织…

table 导出表格 Excel

在请求中需要设置 responseType: blob export const requestExport (api, method, params {}, config) > {const apiToken localStorage.getItem(token);const data method GET ? params : data;let headers {BackServer-Token: ${apiToken},};if (config?.headers…

python调用百度ai将图片/pdf识别为表格excel

python调用百度ai将图片识别为表格excel 表格文字识别(异步接口)图片转excel 表格文字识别V2图片/pdf转excel通用 表格文字识别(异步接口) 图片转excel 百度ai官方文档&#xff1a;https://ai.baidu.com/ai-doc/OCR/Ik3h7y238 使用的是表格文字识别(异步接口)&#xff0c;同步…

【C#】微软的Roslyn 是个啥?

一、说明 Roslyn 是微软重写的C#编译器并开源。 Roslyn 是 C# 和 Visual Basic.NET 开源编译器的代号。以下是它如何在过去十年企业Microsoft的最黑暗中开始&#xff0c;并成为所有C#&#xff08;和VB&#xff09;的开源&#xff0c;跨平台&#xff0c;公共语言引擎&#xff0c…

springboot+mybatis-plus+vue+element+vant2实现短视频网站,模拟西瓜视频移动端

目录 一、前言 二、管理后台 1.登录 2.登录成功&#xff0c;进入欢迎页 ​编辑 3.视频分类管理 4. 视频标签管理 5.视频管理 6.评论管理 ​编辑 7.用户管理 8.字典管理 &#xff08;类似于后端的枚举&#xff09; 9.参数管理&#xff08;富文本录入&#xff09; 10.管…

Docker容器监控之 CAdvisor+InfluxDB+Granfana

通过docker stats命令可以很方便的看到当前宿主机上所有容器的CPU,内存以及网络流量等数据&#xff0c;一般小公司够用了。但是&#xff0c;docker stats统计结果只能是当前宿主机的全部容器&#xff0c;数据资料是实时的&#xff0c;没有地方存储、没有健康指标过线预警等功能…

VMware搭建Hadoop集群 for Windows(完整详细,实测可用)

目录 一、VMware 虚拟机安装 &#xff08;1&#xff09;虚拟机创建及配置 &#xff08;2&#xff09;创建工作文件夹 二、克隆虚拟机 三、配置虚拟机的网络 &#xff08;1&#xff09;虚拟网络配置 &#xff08;2&#xff09;配置虚拟机 主机名 &#xff08;3&#xf…

R语言中的函数23:zoo::rollmean, rollmax, rollmedian, rollsum等等

文章目录 函数介绍rollmean()rollmax()rollmedianrollsum 函数介绍 rollmean(x, k, fill if (na.pad) NA, na.pad FALSE, align c("center", "left", "right"), ...)rollmax(x, k, fill if (na.pad) NA, na.pad FALSE, align c("cen…

Go 语言环境安装

安装包下载地址 https://www.golang.org/dl/ https://golang.google.cn/dl/liunx安装包&#xff1a; windows:*.msi linux:*linux*.tar.gz mas:*.pkg freeBSD:*.freebsd.*.tar.gz安装 unix/linux/mac os x/freebsd安装 1、下载源码包&#xff1a;go1.4.linux-amd64.tar.gz …

(树) 剑指 Offer 26. 树的子结构 ——【Leetcode每日一题】

❓剑指 Offer 26. 树的子结构 难度&#xff1a;中等 输入两棵二叉树 A 和 B&#xff0c;判断 B 是不是 A 的子结构。(约定空树不是任意一个树的子结构) B 是 A 的子结构&#xff0c; 即 A 中有出现和B相同的结构和节点值。 例如: 给定的树 A: 3/ \4 5/ \1 2给定的树 B&…

stable-diffusion-webui汉化教程

第一种方法 1.打开stable diffusion webui&#xff0c;进入"Extensions"选项卡 2.点击"Install from URL" 3、注意"URL for extension’s git repository"下方的输入框 4、填入地址&#xff1a;https://github.com/VinsonLaro/stable-diffus…

TypeScript中数组,元组 和 枚举类型

数组 方式一 let arr: number[] [1, 2, 3, 4]方式二&#xff0c;使用泛型定义 let arr: Array<number> [1, 2, 3, 4]方式三&#xff0c;使用any let arr: any[] [12, string, true] console.log(arr[1]) // string元组 可以定义不同类型定义类型顺序需保持一直 …

C++多线程编程(包含c++20内容)

C多线程编程(包含c20内容) 文章目录 C多线程编程(包含c20内容)线程通过函数指针创建线程通过函数对象创建线程通过lambda创建线程通过成员函数创建线程线程本地存储取消线程自动join线程从线程获得结果 原子操作库原子操作原子智能指针原子引用使用原子类型等待原子变量 互斥互…

[JAVAee]文件操作-IO

本文章讲述了通过java对文件进行IO操作 IO:input/output,输入/输出. 建议配合文章末尾实例食用 目录 文件 文件的管理 文件的路径 文件的分类 文件系统的操作 File类的构造方法 File的常用方法 文件内容的读写 FileInputStream读取文件 构造方法 常用方法 Scan…