TypeScript应用

目录

    • TypeScript应用
        • defineProps的TS写法
        • defineEmits的TS写法
        • ref的TS写法
            • 1.简单数据类型
            • 2.复杂数据类型
        • reactive的TS写法
            • 1.默认值属性是固定的
            • 2.根据默认值推导不出我们需要的类型
        • computed和TS
        • 事件处理与TS
        • Template Ref与TS
        • 非空断言
        • TypeScript类型声明文件
            • TS类型声明文件是什么
            • 内置类型声明文件
            • 第三方库类型声明文件
            • 自定义类型声明文件

TypeScript应用

vue项目中使用ts,script加上 lang=”ts“ 才能写ts代码

<script setup lang="ts"></script>
defineProps的TS写法

父组件

<template><div><h2>父组件</h2><p>{{ money }}---{{ car }}</p><MyCom :money="money" ></MyCom></div>
</template><script setup lang="ts">
import MyCom from './components/MyCom.vue';
import {reactive,ref} from 'vue'
let money =ref(1000);
let car = ref("宝马")
</script>

子组件

<template><div><h2>子组件</h2><p>{{ money }}====={{ car }}</p></div>
</template>
<script setup lang="ts">
//   const props = defineProps({
//     money:{
//         type:Number,
//         required:true
//     },
//     car:{
//         type:String,
//         required:false,
//         default:"麻喇沙蒂"
//     }
//   })
// 1.通过泛型参数来定义props的类型
// const props = defineProps<{
//     money:number
//     car?:string
// }>()
// 2.给props设置默认值 需要使用withDefaults
// const props = withDefaults(
//    defineProps<{
//     money:number;
//     car?:string
//    }>(),
//    {
//      car:"麻喇沙蒂"
//    }
// )
// 3.上面的写法太笨拙, 使用响应式语法糖 解构 + defineProps
const {money,car = "麻喇沙蒂"} = defineProps<{money:numbercar?:string
}>()
// 默认值没有显示   需要显式的选择开启
</script>

默认值没有显示 需要显示的选择开启

//vite.config.ts
export default defineConfig({plugins: [vue({reactivityTransform:true})],
})
defineEmits的TS写法

父组件

<template><div><h2>父组件</h2><p>{{ money }}---{{ car }}</p><MyCom :money="money" @changeMoney="change"></MyCom></div>
</template>
<script setup lang="ts">
import MyCom from './components/MyCom.vue';
import {reactive,ref} from 'vue'
let money =ref(1000);
let car = ref("宝马")const change = (v:number)=>{money.value -= v
}
</script>

子组件

<template><div><h2>子组件</h2><p>{{ money }}====={{ car }}</p><button @click="changeMoney">更改money</button></div>
</template>
<script setup lang="ts">
// 3.上面的写法太笨拙, 使用响应式语法糖 解构 + defineProps
const {money,car = "麻喇沙蒂"} = defineProps<{money:numbercar?:string
}>()
// 默认值没有显示   需要显示的选择开启// 子传父
// const emit = defineEmits(['changeMoney','changeCar'])const emit = defineEmits<{(e:'changeMoney',money:number):void(e:'changeCar',car:string):void
}>()
const changeMoney=()=>{emit('changeMoney',10)
}
</script>
ref的TS写法

ref()会隐式的依据数据推导类型

1.简单数据类型

推荐使用类型推导

// const money =ref(10)
const money =ref<number>(10)
2.复杂数据类型

指定泛型

// 类型别名--单项类型
type Todo = {id:numbername:stringdone:boolean
}
const list = ref<Todo[]>([])
/*** 复杂数据 --后台返回数据,默认值是空,无法进行类型推导[{id:1,name:"zs",done:true},{id:2,name:"ls",done:false}]*/setTimeout(()=>{list.value =[{id:1,name:"zs",done:true},{id:2,name:"ls",done:false}]
},1000)
reactive的TS写法

reactive()也会隐式的依据数据推导类型

1.默认值属性是固定的

推荐使用类型推断

// 默认值属性是固定的 --类型推断
const book =reactive({title:"vue3学习"})
2.根据默认值推导不出我们需要的类型

推荐使用接口或者类型别名给变量指定类型

type Book1 = {title:stringyear?:number
}// 不推荐使用reactive()的泛型参数
const b:Book1 = reactive({title:"hello"})
b.year = 2023
computed和TS

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

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

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

const doubleMoney = computed<string>(()=>(count.value*2).toFixed(2))
事件处理与TS
<template><div><input type="text" @change="handleChange($event)"></div>
</template>
<script setup lang="ts">
// 参数“event”隐式具有“any”类型。
// @change="handleChange($event)" 查看$event类型
// 鼠标放到@change上 查看类型const handleChange = (event:Event)=>{// event.target 是 EventTarget | null 类型// console.log(event.target.value)// document.querySelector("input")  查看返回值类型console.log((event.target as HTMLInputElement).value)// event.target as HTMLInputElement  as限制event.target 的类型是HTMLInputElement}
</script>
Template Ref与TS

模板ref需要通过一个显式指定的泛型参数,默认值是null

<template><div><input type="text" ref="el"><p>123</p></div>
</template>
<script setup lang="ts">
import {ref,onMounted} from 'vue'
const el = ref<HTMLInputElement |null>(null)
document.querySelector('p')onMounted(()=>{// 严格的类型安全  ? 可选链// 组件被挂载前,ref的值都是初始的null// 也可能是v-if的行为将引用的元素卸载时会设置为nullel.value?.focus()
})
</script>
非空断言

类型可能是null 或undefined的值

<template><div><input type="text" ref="input" value="abc"></div>
</template>
<script setup lang="ts">
import {ref,onMounted} from 'vue'const inp = ref<HTMLInputElement | null>(null)onMounted(()=>{// console.log(inp.value?.value)  可选链// 逻辑判断// if(inp.value){//   console.log(inp.value.value)//   inp.value.value = "123"// }// 一定要确定不为空  ---非空断言console.log(inp.value!.value)inp.value!.value = "123"
})
</script>
TypeScript类型声明文件
TS类型声明文件是什么

项目中安装的第三方库都是打包后的js代码,但是我们使用的时候却有对应的TS类型提示,为什么?

在第三方库中的js代码都有对应的TS类型声明文件

在ts中以 .d.ts为后缀的文件,我们称之为ts类型声明文件。它的作用是描述js模块内所有导出成员的类型信息

ts中有两种文件类型 .ts文件 .d.ts文件作用是什么?

  • .ts文件
    • 既包含类型信息又可执行代码
    • 可以被编译为js文件,然后执行代码
    • 用途:编写程序代码的地方
  • .d.ts文件
    • 只包含类型信息的类型声明文件
    • 不会生成.js文件,仅用于提供类型信息,在.d.ts文件中不允许出现可执行的代码,只用于提供类型
    • 用途: 为js提供类型信息

所以 .ts是代码实现文件 .d.ts是类型声明文件

内置类型声明文件
const arr =[1,2,3]   
//鼠标放在forEach上查看类型   ctrl +鼠标左键  进入 lib.es5.d.ts类型声明文件中
arr.forEach
第三方库类型声明文件

下载axios 查看类型声明文件 node_modules/axios/index.d.ts

自定义类型声明文件
  • 创建types/data.d.ts
  • 创建需要共享的类型,使用export导出
  • 在需要使用共享类型.ts文件中,通过import 导入即可(.d.ts后缀可以省略)

src/types/data.d.ts

export type Person = {id:numbername:stringage:number
}

App.vue

import {Person} from './types/data'const p:Person ={id:100,name:"Zs",age:19
}

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

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

相关文章

【UE5 Cesium】15-Cesium for Unreal 加载本地影像和地形

目录 一、加载全球无高度地形 二、加载区域DEM 三、加载离线地图影像 一、加载全球无高度地形 1. 先去如下网址下载全球无高度地形&#xff1a;Using a global terrain layer without height detail - #9 by RidhwanAziz - Cesium for Unreal - Cesium Community 下载后如下…

好物周刊#12:计算机考研资料

https://cunyu1943.github.io https://yuque.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. JEECG BOOT 低代码开发平台 一款基于代码生成器的低代码开发平台&#xff01;前后…

scala数组函数合集

目录 1. 添加类函数 2.生成类函数 3.删除类函数 4.查找类函数 5.统计类函数 6.修改类函数 7.判断类函数 8.获取集合元素 9.集合操作类函数 10.转换类函数 11.工具类函数 12.集合内与集合间计算函数 在 scala 中Array数组是一种可变的、可索引的数据集合 创建数组…

FFmpeg合并多个音频并解决声音变小的方法

在制作或编辑视频时,音频是一个重要的组成部分。但是当尝试使用FFmpeg在MP4视频中插入多个音频时,可能会遇到声音变小的问题。 本文将详细解释这一现象的原因,并提供代码示例来解决这一问题。 文章目录 多个音频插入MP4声音变小原因Python合并音频和解决办法FFmepg合并音频…

优秀程序员是怎么思考的?

首发日更公 Z 号&#xff1a;十二又十三 作为一名优秀的程序员&#xff0c;思考是我们工作中最重要的一部分。它不仅能够帮助我们解决问题&#xff0c;还能够提升我们的技术水平和职业发展。那么&#xff0c;优秀程序员是如何思考的呢&#xff1f;本文将为您介绍一个思考框架和…

想升级macOS Big Sur,但是MacBook内存空间不够该怎么办?

随着使用时间的增长&#xff0c;我们会发现Mac电脑的存储空间越来越少&#xff0c;这时候我们就需要对Mac电脑进行清理&#xff0c;以释放更多的存储空间。那么&#xff0c;Mac空间不足怎么解决呢&#xff1f; 1.清理垃圾文件 Mac空间不足怎么解决&#xff1f;首先要做的就是清…

Linux: 基础IO

学习目标 1.C接口与系统调用接口的差别 2.文件描述符, 重定向, 一切皆文件, 缓冲区 3.fd与FILE, 系统调用和库函数的关系 4.系统中的inode 5.软硬链接 6.动静态库 预备知识 1.文件 内容 属性 2.文件的所有操作: a. 对内容的操作 b.对属性的操作 3.文件在磁盘(硬件)上, 我…

前端—— 分层模型和应用协议

1 分层模型 MAC地址 可以认为计算机专属&#xff0c;可以认为每台计算机的 MAC地址 固定不变&#xff1b; IP地址 可以认为是计算机当前的【家庭地址】&#xff0c;动态唯一&#xff0c;家庭地址变化&#xff0c;IP地址 也跟着变化&#xff1b; 举个例子&#xff0c;A 给 B 发…

MyBatisPlus(十五)分页查询

说明 MyBatisPlus 提供了分页查询的功能。 MyBatisPlus 的分页功能&#xff0c;是通过分页插件实现的。要使用分页功能&#xff0c;需要配置分页插件的拦截器。 MyBatisPlus 的分页功能&#xff0c;可以通过内置的API接口实现&#xff1b;也可以通过自定义的 mapper#method …

consulmanage使用

一、监控自建主机 需要在所有被监控的主机上部署node_exporter收集主机的监控数据 在此页面下载node_exporter安装包 Download | Prometheus 下载后解压安装包&#xff0c;并启动node_exporter服务 mkdir /opt/node_exporter && cd /opt/node_exporter tar -zxvf node_…

C/S架构学习之多线程实现TCP并发服务器

并发概念&#xff1a;并发是指两个或多个事件在同一时间间隔发生&#xff1b;多线程实现TCP并发服务器的实现流程&#xff1a;一、创建套接字&#xff08;socket函数&#xff09;&#xff1a;通信域选择IPV4网络协议、套接字类型选择流式&#xff1b; int sockfd socket(AF_IN…

【计算机视觉|人脸建模】学习从4D扫描中获取的面部形状和表情的模型

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Learning a model of facial shape and expression from 4D scans 链接&#xff1a;Learning a model of facial shape and expression from 4D scans | ACM Transactions on Graphics Pe…

vue项目 ueditor使用示例

简介 UEditor是由百度Web前端研发部开发的所见即所得富文本web编辑器&#xff0c;具有轻量&#xff0c;功能丰富&#xff0c;易扩展等特点。UEditor支持常见的文本编辑功能&#xff0c;如字体、颜色、大小、加粗、斜体、下划线、删除线等&#xff0c;同时还支持超链接、图片上…

stm32的GPIO寄存器操作以及GPIO外部中断,串口中断

一、学习参考资料 &#xff08;1&#xff09;正点原子的寄存器源码。 &#xff08;2&#xff09;STM32F103最小系统板开发指南-寄存器版本_V1.1&#xff08;正点&#xff09; &#xff08;3&#xff09;STM32F103最小系统板开发指南-库函数版本_V1.1&#xff08;正点&a…

【数据结构】论如何拿捏快速排序?(含非递归)

目录 一&#xff0c;快速排序&#xff08;递归&#xff09; 1&#xff0c;快排思想 2&#xff0c;霍尔排序 3&#xff0c;挖坑法 4&#xff0c;前后指针法 5&#xff0c;快速排序优化 1&#xff0c;三数取中法选key 2&#xff0c;小区间优化 二&#xff0c;快速排序&a…

Decorator

Decorator 动机 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”&#xff0c; 由于继承为类型引入的静态特质&#xff0c;使得这种扩展方式缺乏灵活性&#xff1b; 并且随着子类的增多&#xff08;扩展功能的增多&#xff09;&#xff0c;各种子类的组合&#xff…

typescript: Builder Pattern

/*** file: CarBuilderts.ts* TypeScript 实体类 Model* Builder Pattern* 生成器是一种创建型设计模式&#xff0c; 使你能够分步骤创建复杂对象。* https://stackoverflow.com/questions/12827266/get-and-set-in-typescript* https://github.com/Microsoft/TypeScript/wiki/…

用这些IDEA插件,让你早下班两小时

GenerateAllSetter:一键调用一个对象的所有setter方法 RestfulTool:自动显示所有URL接口&#xff0c;快速检索接口 SequenceDiagram:以图形界面形式显示方法调用链&#xff0c;方便阅读源码、梳理代码 CamelCase:变量下划线转驼峰命名 Rainbow Brackets:帮助程序员识别代码中括…

SpringCloud Alibaba - Sentinel 限流规则(案例 + JMeter 测试分析)

目录 一、Sentinel 限流规则 1.1、簇点链路 1.2、流控模式 1.2.1、直接流控模式 1.2.2、关联流控模式 a&#xff09;在 OrderController 中新建两个端点. b&#xff09;在 Sentinel 控制台中对订单查询端点进行流控 c&#xff09;使用 JMeter 进行测试 d&#xff09;分…

Aurora中的策略模式和模板模式

Aurora中的策略模式和模板模式 在aurora中为了方便以后的扩展使用了策略模式和模板模式实现图片上传和搜索功能&#xff0c;能够在配置类中设置使用Oss或者minio上传图片&#xff0c;es或者mysql文章搜索。后续有新的上传方式或者搜索方式只需要编写对应的实现类即可&#xff…