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.xdnf.cn/news/148655.html

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

相关文章

QT实现TCP服务器客户端的实现

ser&#xff1a; widget.cpp&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个服务器server new QTcpServer(this);// 此时&#xf…

软件设计师_计算机网络_学习笔记

文章目录 4.1 网路技术标准与协议4.1.1 协议4.1.2 DHCP4.1.3 DNS的两种查询方式 4.2 计算机网络的分类4.2.1 拓扑结构 4.3 网络规划与设计4.3.1 遵循的原则4.3.2 逻辑网络设计4.3.3 物理网络设计4.3.4 分层设计 4.4 IP地址与子网划分4.4.1 子网划分4.4.2 特殊IP 4.5 HTML4.6 无…

BL808学习日志-2-LVGL for M0 and D0

一、lvgl测试环境 对拿到的M1S_DOCK开发板进行开发板测试&#xff0c;博流的官方SDK是支持M0和D0两个内核都进行测试的&#xff1b;但是目前只实现了M0的LVGLBenchmark&#xff0c;测试D0内核中发现很多莫名其妙的问题。一会详细记录。 使用的是开发板自带的SPI显示屏&#xff…

STM32复习笔记(五):FSMC连接外部SRAM

目录 Preface&#xff1a; &#xff08;一&#xff09;原理相关 &#xff08;二&#xff09;CUBEMX配置 &#xff08;三&#xff09;轮询方式读写 &#xff08;四&#xff09;DMA方式读写 Preface&#xff1a; STM32F4有一个FSMC&#xff08;Flexible Static Memory Contr…

C++ YAML使用

C++工程如何使用YAML-cpp 一、前期准备工作 1、已安装minGW、cmake、make等本地工具。 2、下载YAML-cpp第三方开源代码(一定要下载最新的release版本,不然坑很多)。 3、生成YAML-cpp静态库 (1)在yaml-cpp-master下建立build文件夹; (2)在该文件夹下生成MakaFile文…

Ubuntu22.04 交叉编译gcc9.5 for arm

一、准备 环境&#xff1a;ubuntu22.04为刚刚安装&#xff0c;未安装gcc等包 vi ~/.bashrc输入 export PATH$PATH:/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin 保存,reboot 安装&#xff1a; sudo apt install cmake sudo apt install gawk sudo apt instal…

C++ 程序员入门之路——旅程的起点与挑战

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

国庆假期day5

作业&#xff1a;请写出七层模型及每一层的功能&#xff0c;请绘制三次握手四次挥手的流程图 1.OSI七层模型&#xff1a; 应用层--------提供函 表示层--------表密缩 会话层--------会话 传输层--------进程的接收和发送 网络层--------寻主机 数据链路层----相邻节点的可靠传…

国庆10.4

QT实现TCP服务器客户端 服务器 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器头文件 #include <QTcpSocket> //客户端头文件 #include <QList> //链表容器 #include <QMe…

mysql面试题14:讲一讲MySQL中什么是全同步复制?底层实现?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:讲一讲mysql中什么是全同步复制?底层实现? MySQL中的全同步复制(Synchronous Replication)是一种复制模式,主服务器在写操作完成后,必须等待…

Apacha Flume

0目录 1.Flume概述 2.Flume安装部署 3.案例1 4.案例2 5.案例3 1.Flume概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构&#xff0c;灵活简单。 1.2 Flume基础架构 Flume组…

ES6中对象的扩展

1. 属性的简洁表示法 可以直接写入变量和函数作为对象的属性和方法。在对象中只写属性名&#xff0c;不写属性值&#xff0c;代表属性值等于和属性名相同的的变量的值。 属性的简写 let foo bar; let baz {foo}; // { foo: bar } // 等同于 let baz { foo: foo}方法的简写…

Nginx高级 第一部分:扩容

Nginx高级 第一部分&#xff1a;扩容 通过扩容提升整体吞吐量 1.单机垂直扩容&#xff1a;硬件资源增加 云服务资源增加 整机&#xff1a;IBM、浪潮、DELL、HP等 CPU/主板&#xff1a;更新到主流 网卡&#xff1a;10G/40G网卡 磁盘&#xff1a;SAS(SCSI) HDD&#xff08;机械…

十天学完基础数据结构-第二天(数据结构简介)

什么是数据结构&#xff1f; 在计算机科学中&#xff0c;数据结构是一种组织和存储数据的方式。它定义了数据的布局&#xff0c;以及对这些数据执行的操作。你可以把数据结构看作是计算机内存中的特定组织方式&#xff0c;就像图书馆中书籍的排列一样。 数据结构可以是各种形…

python获取时间戳

使用 datetime 库获取时间。 获取当前时间&#xff1a; import datetime print(datetime.datetime.now()) . 后面的是微秒&#xff0c;也是一个时间单位&#xff0c;1秒1000000微秒。 转为时间戳&#xff1a; import datetimedate datetime.datetime.now() timestamp date…

【数据结构】堆的应用-----TopK问题

目录 一、前言 二、Top-k问题 &#x1f4a6;解法一&#xff1a;暴力排序 &#x1f4a6;解法二&#xff1a;建立N个数的堆 &#x1f4a6;解法三&#xff1a;建立K个数的堆&#xff08;最优解&#xff09; 三、完整代码和视图 四、共勉 一、前言 在之前的文章中&#xff…

Springboot场景开发多面手

LinkedBear &#xff0c;资深 Java 高级工程师&#xff0c;底层技术研究者与分享者&#xff0c;倾心研究 Spring 技术体系多年&#xff0c;对 Spring、Spring Boot 、SpringCloud 等框架有独到的见解&#xff0c;拥有丰富的框架体系实践经验和架构封装经验。善于总结、输出&…

CharacterEncodingFilter的用法

CharacterEncoding是SpringMVC提供的一个一个过滤器,用于设置请求和响应的字符编码,解决乱码问题,他本身是一个过滤器 那么在SpringBoot中,CharacterEncoding就有一个很好的秒用 setEncoding("UTF-8")设置编码 setForceEncoding(true) 设置请求和响应编码 还需要在配…

leetcode做题笔记160. 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

计算机视觉——飞桨深度学习实战-深度学习网络模型

深度学习网络模型的整体架构主要数据集、模型组网以及学习优化过程三部分&#xff0c;本章主要围绕着深度学习网络模型的算法架构、常见模型展开了详细介绍&#xff0c;从经典的深度学习网络模型以CNN、RNN为代表&#xff0c;到为了解决显存不足、实时性不够等问题的轻量化网络…