TypeScript

背景:

JS 的类型系统存在“先天缺陷”弱类型,JS 代码中绝大部分错误都是类型错误(Uncaught TypeError) 开发的时候,定义的变量本应该就有类型 这些经常出现的错误,导致了在使用 JS 进行项目开发时,增加了找 Bug、改 Bug 的时间,严重影 响开发效率 。

从编程语言的动静来区分,TypeScript 属于静态类型的编程语言JavaScript 属于动态类型的编程 语言

  • 静态类型:编译期做类型检查
  • 动态类型:执行期做类型检查

对于 TS 来说:在代码编译的时候(代码执行前)就可以发现错误(早)

Vue 3 源码使用 TS 重写、Angular 默认支持 TS、React 与 TS 完美配合,TypeScript 已成为大中型前端 项 目的首选编程语言

目前,前端最新的开发技术栈:

  1. React: TS + Hooks
  2. Vue: TS + Vue3
    注意: Vue2 对 TS 的支持不好~

安装编译 TS 的工具包

目标:能够安装ts的工具包来编译ts

内容: 问题:为什么要安装编译 TS 的工具包?

回答:Node.js/浏览器,只认识 JS 代码,不认识 TS 代码。

需要先将 TS 代码转化为 JS 代码,然后 才能运行 安装命令:

npm i -g typescript 或者 yarn global add typescript typescript

用来编译 TS 代码的包,提供了 tsc 命令,实现了 TS -> JS 的转化

注意:Mac 电脑安装全局包时,需要添加 sudo 获取权限: sudo npm i -g typescript yarn

全局安装:

sudo yarn global add typescript

验证是否安装成功:tsc –v(查看 typescript 的版本)

创建基于TS的vue项目

目标:能够使用vite创建vue-ts模板的项目

内容: 基于vite创建一个vue项目,使用typescript模板

yarn create vite vite-ts-demo --template vue-ts

TypeScript基础

TypeScript 是 JS 的超集,TS 提供了 JS 的所有功能,并且额外的增加了:类型系统

所有的 JS 代码都是 TS 代码

JS 有类型(比如,number/string 等),但是 JS 不会检查变量的类型是否发生变化,而 TS 会 检查 TypeScript 类型系统的主要优势:可以显示标记出代码中的意外行为,从而降低了发生错误的可能 性

 let age = 18let age: number = 18  
  • : number 就是类型注解
  • 为变量添加类型约束。比如,上述代码中,约定变量 age 的类型为 number 类型
  • 约定了类型之后,代码的提示就会非常的清晰
  • 变量的初始值的类型 就是该变量的类型
// 错误代码:
// 错误原因:将 string 类型的值赋值给了 number 类型的变量,类型不一致
let age: number = '18'

TypeScript类型概述

JS 已有类型

  • 原始类型,简单类型( number/string/boolean/null/undefined )
  • 复杂数据类型(数组,对象,函数等)

TS 新增类型

  • 联合类型
  • 自定义类型(类型别名)
  • 接口
  • 元组
  • 字面量类型
  • 枚举
  • void ...

TypeScript原始数据类型

原始类型:number/string/boolean/null/undefined

特点:简单,这些类型,完全按照 JS 中类型的名称来书写

let age: number = 18
let myName: string = '老师'
let isLoading: boolean = false
// 等等...

数组类型

数组类型的两种写法: 推荐使用 number[] 写法

// 写法一:
let numbers: number[] = [1, 3, 5]
// 写法二:
let strings: Array<string> = ['a', 'b', 'c']元组
let arr3 :[number , number,boolean]=[19,10,true]

联合类型

需求:数组中既有 number 类型,又有 string 类型,这个数组的类型应该如何写?

let arr: (number | string)[] = [1, 'a', 3, 'b']
  • 解释: | (竖线)在 TS 中叫做联合类型,即:由两个或多个其他类型组成的类型,表示可以是这 些类型中的任意一种
  • 注意:这是 TS 中联合类型的语法,只有一根竖线,不要与 JS 中的或(|| 或)混淆了
let timer: number | null = null
timer = setInterval(() => {}, 1000)
// 定义一个数组,数组中可以有数字或者字符串, 需要注意 | 的优先级
let arr: (number | string)[] = [1, 'abc', 2]let obj:{a:1}|{b:'3'}; //表示 只能是a类型 值为1 或者b 类型 值为'3'   不能有其他属性

export{} :可以防止在另一个文件的变量定义后,本文件不能用,加上export{} 本文件中的变量名和其他文件的一样也可以用。

非原始类型 :

object (常用) Object()let num1 :object = {a:1};let num2: object = [1];

联合类型 :

往往一种类型不满足需求的时候我们会有混合的类型 进行解决

let arr :(number | string ) []  =[1,2.3,'abc']
//联合类型:|
//注意事项:|的优先级比较低,需要用() 包裹,一旦使用联合类型
//那么他们只能用他们共有的类型timer = setInterval(() => {}, 1000)
// 定义一个数组,数组中可以有数字或者字符串, 需要注意 | 的优先级
let arr: (number | string)[] = [1, 'abc', 2]

类型别名

能够使用类型别名给类型起别

类型别名(自定义类型) :为任意类型起别名

使用场景:当同一类型(复杂)被多次使用时,可以通过类型别名,简化该类型的使用


//灵活度高,可以随意搭配使用
//形式一:
type CustomArray = (number | string)[]
let arr1: CustomArray = [1, 'a', 3, 'b']
let arr2: CustomArray = ['x', 'y', 6, 7]
//形式二:
type custom =number | string 
let arr5:custom[]=[12,3,3,'abc']
//形式三:
type s = string
type n = number
let str :s = 'abc'
let str :n=23

解释:

1. 使用 type 关键字来创建自定义类型

2. 类型别名(比如,此处的 CustomArray )可以是任意合法的变量名称

3. 推荐使用大写字母开头

4. 创建类型别名后,直接使用该类型别名作为变量的类型注解即可

函数类型

能够给函数指定类型

函数的类型实际上指的是: 函数参数 返回值 的类型

为函数指定类型的两种方式: 1. 单独指定参数、返回值的类型

2. 同时指定参数、返回值的类型

1. 单独指定参数、返回值的类型:

// 函数声明
function add(num1: number, num2: number): number {
return num1 + num2
}
// 箭头函数
const add = (num1: number, num2: number): number => {
return num1 + num2
}

2. 同时指定参数、返回值的类型 :

type AddFn = (num1: number, num2: number) => number
const add: AddFn = (num1, num2) => {
return num1 + num2
}
  • 解释:当函数作为表达式时,可以通过类似箭头函数形式的语法来为函数添加类型
  • 注意:这种形式只适用于函数表达式

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

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

相关文章

Python中的dataclass:简化数据类的创建

Python中的dataclass是一个装饰器&#xff0c;用于自动添加一些常见的方法&#xff0c;如构造函数、__repr__、__eq__等。它简化了创建数据类的过程&#xff0c;减少了样板代码&#xff0c;提高了代码的可读性和可维护性。有点类似java里面的Java Bean。 让我们看一个简单的例子…

任意子数组和的绝对值的最大值【力扣1749】

一、解题思路 设n表示数组的长度&#xff0c;Min[i]是以nums[i]为开头组成的任意连续子数组中的和最小值&#xff08;若所有子数组的和都大于0&#xff0c;则Min[i]设为0。也就是说丢弃所有子数组&#xff09;&#xff1b;Max[i]是以nums[i]为开头组成的任意连续子数组中的和最…

Cortex-M3的双堆栈MSP和PSP(学习)

M3的栈&#xff0c;先进后出。 是局部变量内存的开销&#xff0c;函数的调用都离不开栈。 Cortex-M3内核使用了双堆栈&#xff0c;即MSP和PSP。 MSP&#xff1a;Main_Stack_Pointer&#xff0c;即主栈。 PSP&#xff1a;Process_Stack_Pointer&#xff0c;即任务栈。 SP&#…

【图像去噪的扩散滤波】基于线性扩散滤波、边缘增强线性和非线性各向异性滤波的图像去噪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Linux配置QT Creator环境:ubuntu中安装QT Creator环境

一、前景 目前市面上很多公司使用QT Creator进行界面开发&#xff0c;基本都会选择在Linux环境进行&#xff0c;优点不仅是市场所需&#xff0c;更是方便后期代码的移植&#xff0c;相较于Windows系统&#xff0c;Linux系统移植性非常好。故此篇文章&#xff0c;介绍如何在Linu…

CentOS 7迁移Anolis OS 8

背景&#xff1a;生产环境客户要求操作系统国产化 操作系统&#xff1a;Centos7.9 内核&#xff1a;5.4.108 服务器可以联网&#xff0c;进行在线迁移&#xff1a; # 下载迁移工具软件源 wget https://mirrors.openanolis.cn/anolis/migration/anolis-migration.repo -O /etc/y…

JAVA获取视频音频时长 文件大小 MultipartFileUtil和file转换

java 获取视频时长_java获取视频时长_似夜晓星辰的博客-CSDN博客 <dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>2.5.1</version></dependency>Slf4j public class VideoTimeUtil…

基于Tars高并发IM系统的设计与实现-实战篇5

基于Tars高并发IM系统的设计与实现-实战篇5 群聊服务 GroupChatServer 群聊服务既可以接受来自BrokerServer的用户请求&#xff0c;也需要接收来自其他服务的RPC请求;所以本服务提供两套RPC接口&#xff1a;通用RPC接口和专用RPC接口。 通用RPC接口 通用RPC接口主要处理如下…

编写第一个 React Native 程序

React Native 目录 使用React Native CLI命令创建的目录如下图所示&#xff1a; 重要目录说明 目录说明__tests__存放测试用例的目录.bundle / config配置文件&#xff08;一般不会用到&#xff09;android 和 IOS 文件夹这两个文件夹主要是存放安卓和 ios 相关的配置文件和…

380. O(1) 时间插入、删除和获取随机元素 -------------Map类型在O(1)复杂度内实现插入删除

380. O(1 时间插入、删除和获取随机元素 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 380. O(1) 时间插入、删除和获取随机元素 https://leetcode.cn/problems/insert-delete-getrandom-o1/description/ 完成…

【Spring】如果你需要使用重试机制,请使用Spring官方的Spring Retry

文章目录 前言Spring Retry的基本使用第一步&#xff0c;引入Spring Retry的jar包第二步&#xff0c;构建一个RetryTemplate类第三步&#xff0c;使用RETRY_TEMPLATE注意事项 拓展方法降级操作重试策略&#xff1a;时间策略重试策略&#xff1a;指定异常策略 前言 Spring Retr…

SpringBootWeb案例-准备工作

目录 前言 准备工作 需求&环境搭建 需求 环境搭建 开发规范 Restful开发规范 统一的响应结果 开发流程 前言 根据过往的文章可以知道目前我已经学习完了前端、后端、数据库的基础知识&#xff0c;接下来通过一个基于SpringBoot工程开发的web项目案例。 准备工作 …

IDEA快捷键200+(按组合分类)

目录 Alt Ctrl Shift AltShift CtrlShift CtrlAlt 其他 Alt 快捷键中文描述英文描述Alt0Commit窗口Alt1Project窗口Alt2Favourite窗口Alt3Find窗口Alt4Run窗口Alt5Debug窗口Alt6Problem窗口Alt7File structureAlt8Services窗口Alt9Git窗口AltF1Select current file or symbol…

视频监控汇聚EasyCVR平台WebRTC流地址无法播放的原因排查

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多…

算法练习工程1.3

* 问题标题&#xff1a;移除元素 * 题意说明&#xff1a; * 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 * 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入…

【Java并发】什么是AQS?

文章目录 什么是AQS?AQS与Synchronized的区别AQS-基本工作机制AQS是公平锁与非公平锁 什么是AQS? 全称是 AbstractQueuedSynchronizer&#xff0c;即抽象队列同步器。它是构建锁或者其他同步组件的基础框架 所谓抽象&#xff0c;其实目的就是把具体的逻辑交给子类去实现&…

【计算机视觉】关于图像处理的一些基本操作

目录 图像平滑滤波处理均值滤波计算过程python实现 高斯滤波计算过程python实现 中值滤波计算过程python实现 图像的边缘检测Robert算子计算过程python实现 图像处理腐蚀算子计算过程python实现 Hog&#xff08;梯度方向直方图&#xff09;特征计算流程&#xff1a;Hog的特征维…

什么是自定义表单和工作流?看完这篇文章就懂了

在很多中大型企业中&#xff0c;低代码技术平台的应用价值是较高的&#xff0c;也深得广大用户朋友的青睐和喜爱。其中的自定义表单和工作流是该平台的主要功能&#xff0c;可以解决当前工作效率低下、解放程序员时间和精力等各种现实问题&#xff0c;可以说是实现办公流程化、…

Pytorch量化之Post Train Static Quantization(训练后静态量化)

使用Pytorch训练出的模型权重为fp32&#xff0c;部署时&#xff0c;为了加快速度&#xff0c;一般会将模型量化至int8。与fp32相比&#xff0c;int8模型的大小为原来的1/4, 速度为2~4倍。 Pytorch支持三种量化方式&#xff1a; 动态量化&#xff08;Dynamic Quantization&…

JVM 垃圾回收

垃圾回收算法 标记-清除算法&#xff08;Mark and Sweep&#xff09; 标记-清除算法分为两个阶段。在标记阶段&#xff0c;垃圾收集器会标记所有活动对象&#xff1b;在清除阶段&#xff0c;垃圾收集器会清除所有未标记的对象。标记-清除算法存在的问题是会产生内存碎片&#…