【菜狗学前端】 初探TS(结合在vue3中的使用)

TypeScript是拥有类型的JavaScript超集,它可以编译成普通、干净、完整的JavaScript代码。我们可以将TypeScript理解成加强版的JavaScript。

简单来说:Ts是带类型语法的Js; Ts是Js的超集

TS官方网站:https://www.typescriptlang.org/

TS中文官网:https://www.tslang.cn/

一、基础语法

js已有类型:

        基本类型: number, string, boolean, null, undefined, symbol,BigInt

        引用数据类型:对象、数组、函数

ts新增类型:

        联合类型、类型别名、接口、元祖、字面量类型、枚举、void、any、泛型等

(一) 原始类型

1.简单类型 :xx

let age: number = 18;let uname: string = "zhangsan";let flag: boolean = false;// null和und类型用的比较少let nullValue: null = null;let undefinedValue: undefined = undefined;

PS:其实最后.ts转为.js文件时void仍会变为undefined,TS中加上void一般只是为了将函数返回值和其他区分出来。

2.引用类型 :xx[]

a.数组
let arr1 = ["a", "b", "c"]let arr3: number[] = [1, 2, 3]let arr2: string[] = ["a", "b", "c"]console.log(arr1, arr2, arr3);let arr4: Array<string> = ["ok", "hello"]console.log(arr4);

思考:数组中是可以存放多种数据类型

        联合类型:|(竖线)在TS中叫做联合类型

        即:由两个或多个其他类型组成的类型,表示可以是这些类型中的任意一种

b.函数
// 函数 给参数和返回值 指定类型// 函数声明(具名函数)function add(a: number, b: number): number {return a + b}console.log(add(1, 2));// 函数表达式(匿名函数)let add2 = (a: number, b: number): number => {return a + b}console.log(add2(1, 2));// 箭头函数写法type AddFn = (a: number, b: number) => number// 通过类似箭头函数形式的语法为函数添加类型,只适用于函数表达式let add3: AddFn = (a, b) => {return a + b}console.log(add3(3, 3));

可选参数?

使用 ? 将参数标记为可选

const fn = (n?: number) => {

}

fn()

fn(1)


函数返回值:

在js中默认返回值是und,在ts中默认返回的是void

如果指定返回值类型是 undefined 那返回值一定是 undefined

// void和undfined类型// 如果函数没有返回值,定义函数类型时返回值的类型为voidconst say = () => {// console.log('hello ts~');}console.log(say());console.log(typeof say());const say2 = (): void => {// console.log('hello ts~');}console.log(say2());console.log(typeof say2());// 区分:在js中默认返回值是und,在ts中默认返回的是void// 如果指定返回值类型是 undefined 那返回值一定是 undefinedconst say3 = (): undefined => {// console.log('hello ts~');}console.log(say3());console.log(typeof say3());
c.对象
// 空对象let obj1 = {}let obj2: {} = {}// 指定对象里面的属性和方法// let obj4: { name: string, say(): void } = {let obj4: { name: string; say(): void } = {name: "wc",    // 对象里面写方法的两种写法    // say():void    say: () => void}// 竖着写 可以换行let obj5: {// name: string,name: string;say(): void} = {name: "wc",say() { }}

(二) 类型别名 type

给某个指定类型起别名

定义类型别名,遵循大驼峰命名,类似于变量

        什么时候是用类名别名?

        当同一类型(引用)被多次使用,可以通过类型别名简化

// 语法:type 类型别名=具体类型type A = (string | number)[]let arr9: Aarr9 = [1, "a", 3]

交叉类型 &

// type  交叉类型type APoint2D = {x: number,y: number}type APoint3D = APoint2D & {z: number}let o: APoint3D = {x: 1,y: 2,z: 3}

(三) 接口 interface (可继承extends)

interface 后面跟的是接口名称

注意:接口的每一行只能有一个属性或者一个方法 每一行不需要加分号

interface Person {

    name: string

    age: number

    say: () => void

}

let p: Person = {name: "wangcai",age: 18,say() { }}console.log(p);// 接口是可继承的// 2D坐标interface Point2D {x: numbery: number}let p2: Point2D = {x: 1,y: 2}console.log(p2);// 如何实现继承?// 使用extends实现接口继承,达到类型复用// 继承后 接口A 拥有了接口B的所有属性和函数的类型声明 interface Point3D extends Point2D {    z: number}let p3: Point3D = {x: 1,y: 2,z: 3}

(四)interface和type的区别

1.type是起别名,interface 是自己发明类型 自定义类型
 

// 会报错// type APerson = {//     name:string// }// type APerson = {//     age:number// }interface Person1 {name1: string};interface Person1 {age1: number};// 类型合并const c1: Person1 = {name1: "wc",age1: 18}

2.type不可以重复定义,interface可以重复定义会合并

3.type支持对象类型和其他类型,interface只支持对象类型

4.type复用:交叉类型 &,interface复用:可以继承 extends

二、ts在vue3中的使用

(一)ref和ts

// 手动指定类型

const count =ref<number>(0)

<template><div>{{ count }}</div><ul><li v-for="item in list" :key="item.id">{{ item.name }}</li></ul></template><script setup lang="ts">import { ref, reactive } from "vue"// 手动指定类型const count =ref<number>(0)// 自动类型const count1=ref(0)type ToDoItem={id:number;name:string;done:boolean}// [{},{},{}]const list=ref<ToDoItem[]>([])setTimeout(()=>{list.value=[{ id: 100, name: "吃饭", done: false },{ id: 101, name: "睡觉", done: false },]},1000)</script>

(二)reactive和ts

type Book={

title:string;

year?:number

}

const book:Book=reactive({

title:"ts语法基础"

})

<template>{{ book.title }} -- {{ book.year }}</template><script setup lang="ts">import { ref, reactive } from "vue"// 1.手动指定类型type Book={title:string;year?:number}const book:Book=reactive({title:"ts语法基础"})book.year=2023// 2.自动类型推导const Book=reactive({title:"ts语法基础2"})</script>

(三)computed和ts

const doubleCountB = computed<string(() => (count.value * 2).toFixed(2))

<template>{{ count }} -- {{ doubleCount }} -- {{ doubleCountB }}{{ typeof count }} -- {{ typeof doubleCount }} -- {{ typeof doubleCountB }}</template><script setup lang="ts">import { ref, computed } from "vue"const count = ref(205)// 1.自动类型推导// toFixed(2)保留2位小数,且返回值类型为stringconst doubleCount = computed(() => (count.value * 2).toFixed(2))// 2.指定计算属性的类型const doubleCountB = computed<string>(() => (count.value * 2).toFixed(2))</script>

(四)defineprops和ts(父传子)

defineProps<{

money:number;

car?:string

}>()

Child.vue

<template><div class=""><p>{{ money }}</p><p>{{ car }}</p></div></template><script setup lang="ts">// vue3基本写法// defineProps({//     money:{//         type:Number,//         required:true//     }// })// ts基本语法// defineProps<{//     money:number;//     car?:string// }>()// ts+有默认值的写法withDefaults(defineProps<{money:number;car?:string}>(),{money:666,car:"xiaomi"})</script>

App.vue

<template><div><!-- 父传子 --><Child :money="money"></Child></div></template><script setup lang="ts">import { ref} from "vue"import Child from "./components/Child.vue"const money=ref(666)const car=ref('大众')</script>

(五)defineEmits和ts(子传父)

const emit =defineEmits<{

(e:"changeMoney",money:number):void;

(e:"changeCar",car:string):void;

}>()

Child.vue

<template><p>{{ money }}</p><button @click="emit('changeMoney', 800)">改money</button><p>{{ car }}</p><button @click="emit('changeCar', '宝马')">改car</button></template><script setup lang="ts">// vue3基本写法// const emit = defineEmits(["changeMoney", "changeCar"])// ts写法defineProps<{money: number;car?: string;}>()const emit =defineEmits<{(e:"changeMoney",money:number):void;(e:"changeCar",car:string):void;}>()</script>

App.vue

<template><!-- 子传父 --><Child:money="money":car="car"@change-money="money=$event"@change-car="car=$event"></Child></template><script setup lang="ts">import { ref} from "vue"import Child from "./components/Child.vue"const money=ref(666)const car=ref('大众')</script>

(六)事件处理和ts :Event

as 断言​​​​​​​

e:Event

<template><input type="text" @change="handleChange" value="hi"></template><script setup lang="ts">// 不处理类型// const handleChange=(e)=>{//     console.log(e.target.value)// }const handleChange=(e:Event)=>{// as 断言// e.target 事件源console.log((e.target as HTMLInputElement).value);}</script>

(七)ref写在标签上获取 :HTMLInputElement

const input = ref<HTMLInputElement | null(null)

<template><div><input type="text" ref="input"></div></template><script setup lang="ts">import { onMounted, ref } from 'vue'const input = ref<HTMLInputElement | null>(null)// 页面加载完毕调用钩子函数onMounted(()=>{input.value?.focus()})</script>

(八)非空断言 !

// ! 非空断言(方法一)

input.value!.value = "456" //可以赋值

// 类型守卫(方法二)

if (input.value) {

input.value.value = "789" //可以赋值

}

<template><div><input type="text" ref="input" value="123"></div></template><script setup lang="ts">import { onMounted, ref } from 'vue'const input = ref<HTMLInputElement | null>(null)// 页面加载完毕调用钩子函数onMounted(() => {// 自动获取焦点input.value?.focus()// 使用ES6 输入框没有获取到,对于可能出现null,console.log(input.value?.value);// ?可选参数 可选链  报错 因为不能赋值// input.value?.value = "456"// ! 非空断言(方法一)input.value!.value = "456" //可以赋值// 类型守卫(方法二)if (input.value) {input.value.value = "789" //可以赋值}})</script>

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

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

相关文章

CXL协议中 Register Locator DVSEC详解

✨ 前言&#xff1a; Register Locator DVSEC&#xff08;Designated Vendor-Specific Extended Capability&#xff09;是一种PCI Express&#xff08;PCIe&#xff09;配置空间的能力&#xff0c;专为CXL&#xff08;Compute Express Link&#xff09;技术中的设备设计。这包…

软考初级网络管理员_09_网络单选题

1.下列Internet应用中对实时性要求最高的是()。 电子邮件 Web浏览 FTP文件传输 IP电话 2.在Internet中的大多数服务(如WWW、FTP等)都采用()模型。 星型 主机/终端 客户机/服务器 网状 3.子网掩码的作用是()。 可以用来寻找网关 可以区分IP和MAC 可以识别子网 可以…

[DDR5 Jedec] 读操作 Read Command 精讲

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR》 Read 读取命令也可以视为列读取命令。当与正确的bank地址和列地址结合使用时&#xff0c;通过激活命令&#xff08;行访问&#xff09;移动到检测放大器中的数据&#xff0c; 现在被推送到数…

python 基础--数据类型、基本数据类型之间的相互转换

文章目录 一、python 数据类型介绍二、基本数据类型2.1 Numbers&#xff08;数字类型&#xff09;2.2 String&#xff08;字符串类型&#xff09;2.2.1 不同引号字符串之间的区别2.2.2 转义字符和 python 输出函数2.2.3 字符串的相关操作&#xff08;字符串拼接、占位符、字符串…

python爬虫:实现动态网页的爬取,以爬取视频为例

引言: 爬虫也被称为网络蜘蛛(Spider),是一种自动化的软件程序,能够在互联网上漫游,按照一定的规则和算法抓取数据。 爬虫技术广泛应用于搜索引擎、 数据挖掘 、信息提取等领域,是互联网技术的重要组成部分。 摘要: 作为爬虫的初学者,网页越简单越好,因为网页的结构…

用Python代码锁定Excel单元格以及行和列

Excel能够帮助用户高效地组织数据&#xff0c;还支持复杂的公式计算和数据分析。而随着团队协作的日益频繁&#xff0c;保护数据的准确性和完整性变得尤为重要。在Excel表格中&#xff0c;我们可以通过锁定特定的单元格或区域&#xff0c;防止对单元格内容进行随意修改&#xf…

pycharm上传文件到服务器python代码部署到服务器

文章目录 step1&#xff1a;【Tools】—-【Deployment】—-【Configuration】step2&#xff1a;【 】—-【SFTP】—-【输入服务器名称】step3&#xff1a;【 Deployment path】—-【输入相对地址】step4&#xff1a;【 选中项目右击】—-【Deployment】—-【upload to xxxxx】…

css实现优惠券样式

实现优惠券效果&#xff1a; 实现思路&#xff1a; 需要三个盒子元素&#xff0c;使用 css 剪裁&#xff0c;利用 ellipse 属性&#xff0c;将两个盒子分别裁剪成两个半圆&#xff0c;位置固定在另一个盒子元素左右两边适当位置上。为另一个盒子设置想要的样式&#xff0c;圆角…

MFC socket编程-服务端和客户端流程

MFC 提供了一套丰富的类库来简化 Windows 应用程序的网络编程。以下是使用 MFC 进行 socket 编程时服务端和客户端的基本流程&#xff1a; 服务端流程&#xff1a; 初始化 Winsock&#xff1a; 调用 AfxSocketInit 初始化 Winsock 库。 创建 CSocket 或 CAsyncSocket 对象&am…

汇编:保护模式下的寻址方式

寻址&#xff08;Addressing&#xff09;是计算机在访问内存时定位数据的过程&#xff1b;它涉及如何指定内存位置&#xff0c;以便处理器能够正确地读取和写入数据&#xff0c;不同的计算机架构和操作模式支持多种不同的寻址方式。以下是常见的寻址方式&#xff1a; ①立即数…

强烈推荐的JetBrains家族的插件

Rainbow Brackets 该插件提供了不同颜色的对应的括号格式&#xff0c;便于在开发中检查缺少括号的情况&#xff0c;效果如下 CodeGlance Pro 该插件是代码缩略图插件&#xff0c;方便在开发中快速定位代码位置&#xff0c;也可作为滚动条使用&#xff0c;CodeGlance Pro搜不到…

webpack插件

plugin 插件向第三方开发者提供了 webpack 引擎中完整的能力。使用阶段式的构建回调&#xff0c;开发者可以引入它们自己的行为到 webpack 构建流程中。创建插件比创建 loader 更加高级&#xff0c;因为你将需要理解一些 webpack 底层的内部特性来做相应的钩子 为什么需要一个…

(Git)多人协作1

文章目录 前言总结 前言 目标&#xff1a;master分支下file.txt文件新增“aaa”,“bbb” 实现&#xff1a;开发者1新增“aaa”,开发者2新增“bbb” 条件&#xff1a;在同一个分支下协作完成 实际开发过程中&#xff0c;每个用户都与属于自己的码云账户&#xff0c;如果想要进…

windows安装SQLyog

windows安装SQLyog 1. 下载 SQLyog 安装包 访问 SQLyog 的官方网站。在网站上找到下载链接&#xff0c;通常会有一个“Download”或“Try Now”按钮。如果需要注册或填写信息以获取下载链接&#xff0c;请按提示操作。 2. 运行安装程序 下载完成后&#xff0c;双击运行下载…

css设置滚动条样式;滚动条设置透明

滚动条透明代码 .resizable-div {resize: both;/* 允许水平和垂直调整大小 */overflow: auto;/* 确保内容超出边界时出现滚动条 */ } /* 滚动条整体样式 */ .resizable-div::-webkit-scrollbar {width: 4px; /* 竖直滚动条宽度 */height: 4px; /* 水平滚动条高度 */ }/* 滚动条…

湖州等保测评公司有几家?在那里?电话多少?

湖州等保测评公司有几家&#xff1f;在那里&#xff1f;电话多少&#xff1f; 【回答】&#xff1a;目前湖州暂未有正规等保测评机构。因此湖州企业可以就近选择浙江省内正规等保测评机构&#xff0c;有可以网上寻找合适的等保测评机构。 知识拓展1&#xff1a;浙江正规等保测…

Python学习笔记6:pychram相关知识及安装教程,后续需要学习的入门知识

上篇文章说了&#xff0c;今天去公司重新装一下IDE&#xff0c;最后也是把过程这边再记录一下&#xff0c;有需要的可以参考一下。 关于pychram pychram是什么&#xff1f; PyCharm是由JetBrains公司开发的一款流行的Python集成开发环境&#xff08;IDE&#xff09;。它专为…

Linux C/C++ socket

一、第一个网络通讯程序 网络通讯是指两台计算机中的程序进行传输数据的过程客户程序(端):指主动发起通讯的程序。服务程序(端/器):指被动的等待&#xff0c;然后为向它发起通讯的客户端提供服务。 /** 程序名&#xff1a;demo1.cpp&#xff0c;此程序用于演示socket的客户端…

洛谷P1305 新二叉树(树的基本遍历)

题目描述 输入一串二叉树&#xff0c;输出其前序遍历。 输入格式 第一行为二叉树的节点数 &#x1d45b;。(1≤&#x1d45b;≤26) 后面 &#x1d45b; 行&#xff0c;每一个字母为节点&#xff0c;后两个字母分别为其左右儿子。特别地&#xff0c;数据保证第一行读入的节点…

Apollo9.0 PNC源码学习之Control模块(一)—— 控制模块概览

0 前言 从planning的角度看control,首先需要了解的就是相关的数据接口,规划出的轨迹(路径+速度)发给Control模块去执行 modules/planning/planning_component/planning_component.cc planning模块发布轨迹信息 planning_writer_ = node_->CreateWriter<ADCTrajecto…