TypeScript快速梳理

为何需要TypeScript

ts存在静态类型检查:在代码运行前进行检查,发现代码的错误或不合理之处,减少运行时异常的出现的几率,此种检查叫静态类型检查, TypeScript的核心就是静态类型检查,简言之就是把运行时的错误前置。

同样的功能,typescript的代码量要大于JavaScript,但由于typescript的代码结构更加清晰,在后期代码的维护中typescript却远胜于JavaScript

编译typescript

浏览器不能直接运行typescript代码,需要编译为JavaScript再交由浏览器解析器执行。

类型总览

JavaScript中的数据类型:

string、number、Boolean、null、undefined、bigint、symbol、object(array、function、date、error)

typescript中的数据类型:

  1. 上述所有JavaScript类型
  2. 六个新类型
  3. any
  4. unknown
  5. never
  6. void
  7. tuple元组
  8. enum枚举
  9. 两个用于自定义类型的方式
  10. type
  11. interface

any

含义:任意类型,一旦将变量类型限制为any,那就意味着放弃了对该变量的类型检查

//明确的表示a的类型是any-【显式any】
let a:any
//以下对a的赋值,均无警告
a = 100
a = '你好'
a = false//没有明确的表示b的类型是any,但TS主动推断出来b是any-【隐式any】
let b
//以下对b的赋值,均无警告
b = 100
b = '你好'
b = false

注意:any类型的变量,可以赋值给任意类型的变量

let c:any
c = 9
let x: string
x = c //无警告

unknown

含义:未知类型

  1. unknown可以理解为一个类型安全的any,适用于:不确定数据的具体类型
  2. unknown会强制开发者在使用之前进行类型检查,从而提供更强的类型安全性
  3. 读取any类型数据的任何属性都不会报错,而unknown正好与之相反

never

含义:任何值都不是,简言之就是不能有值,undefined、null、‘ ’、0都不行

  1. 几乎不用never去直接限制变量,因为没有意义
  2. never一般是typescript主动推断出来的
  3. never也可用于限制函数的返回值

void

void通常用于函数返回值声明,含义:【函数返回值为空,调用者也不应依赖其返回值进行任何操作】

function logMessage(msg:string):void{console.log(msg)return undefined   //无警告
}
logMessage('你好')

注意:没有编写return去指定函数的返回值,所以logMessage函数是没有显式返回值的,但是会有一个隐式返回值,就是undefined;即:虽然函数返回类型为void,但也可以接受undefined。undefined是void可以接受的一种”空“

  1. 函数是可以返回undefined的,至于显示返回,还是隐式返回,都无所谓
  2. 函数调用者不应关心函数返回的值,也不应依赖返回值进行任何操作,即使返回了

声明函数类型

let count:(a:number,b:number=> number
count = function(x,y){return x+y
}

注意:1. typescript中的”=>“在函数类型声明时表示函数类型,描述其参数类型和返回类型

  1. JavaScript中的”=>“是一种定义函数的语法,是具体的函数体现

声明数组类型

let arr1: string[]
let arr2: Array<string>
arr1 = ['a','b','c']
arr2 = ['hello','world']

tuple

元组是一种特殊的数组类型,可以存储固定数量的元素,并且每个元素的类型是已知的且可以不同。元组用于精确描述一组值的类型,?表示可选元素

//第一个元素是string类型,第二个元素是number类型
let arr1:[string,number]
//第一个元素是number类型,第二个元素是可选的,如果存在,必须是Boolean类型
let arr2:[number,boolean?]
//第一个元素必须是number类型,后面的元素可以是任意数量的string类型
let arr3:[number,...string[]]

enum

  1. 数据枚举

    是最常见的枚举类型,其成员的值会自动递增,且数字枚举还具备反向映射的特点,在下面代码的打印中,可以通过值来获取对应的枚举成员名称

    enum Direction{up,down,left,right
    }
    console.log(Direction) //打印Direction会看到如下内容
    /*
    {0:'up',1:'down',2:'left',3:'right'
    }
    */
    //反向映射
    cosole.log(Direction.up)  //0
    cosole.log(Direction[0])  //up
    //此行代码报错,枚举中的属性是只读的
    Direction.up = 'shang'function walk(n: Direction){if(n === Direction.up)	console.log("向上走")else if(n === Direction.down)	console.log("向下走")else if(n === Direction.left)	console.log("向左走")else if(n === Direction.right)	console.log("向右走")
    }
    walk(Direction.up)
    walk(Direction.down)
    walk(Direction.left)
    walk(Direction.right)
    
  2. 常量枚举

    是一种特殊枚举类型,使用const关键词定义,在编译时会被内联,避免生成一些额外的代码。即使用常量枚举的typescript代码编译后生成的JavaScript代码量较小。

    const enum Direction{up,down,left,right
    }
    

type

可以为任意类型创建别名,让代码更简洁、可读性更强

  1. 基本用法

    type num = number; //num是类型别名
    let price: num
    price = 100
    
  2. 联合类型(一种高级类型,表示一个值可以是几种不同类型之一)

    type status = number|string
    type gender = '男'|'女'
    function printStatus(data:status):void{console.log(data);
    }
    function printGender(data:gender):void{console.log(data);
    }
    printStatus(404)
    printStatus('404')
    printGender('女')
    
  3. 交叉类型(允许将多个类型合并为一个类型,合并后的类型将拥有所有被合并类型的成员。交叉类型通常用于对象类型)

    type area = {height:numberwidth:number
    }
    type address = {num:numbercell: number
    }
    type House = area & address
    const house:House = {height: 100,width:100,num:3,cell:78
    }
    

interface和type的区别

相同点:interface和type都可以用于定义对象结构,两者在许多场景中是可以互换的

不同点:interface更专注于定义对象和类的结构,支持继承、合并;type可以定义类型别名、联合类型、交叉类型,但不支持集成和自动合并

interface和抽象类的区别

相同点:都用于定义一个类的格式

不同点:interface只能描述结构,不能有任何实现代码,一个类可以实现多个接口;抽象类:既可以包含抽象方法,也可以包含具体方法,一个类只能继承一个抽象类

泛型

泛型允许我们在定义函数、类或接口时,使用类型参数来表示未指定的类型,这些参数在具体使用时,才被指定具体的类型

function logData<T>(data:T):T{console.log(data)return data
}
logData<number>(100)
logData<string>('hello')

泛型可以有多个

function logData<T,U>(data1:T,data2:U):T | U{return Date.now() % 2 ? data1:data2
}
logData<number,boolean>(100,true)
logData<string,number>('hello',666)

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

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

相关文章

汽车发动机控制存储芯片MR2A08A

MRAM在汽车发动机控制单元中的关键数据存储&#xff0c;MR2A08A容量4Mb的非易失性存储芯片&#xff0c;符合汽车AEC-Q100 1级合格选项&#xff0c;可以在遇到的非常高的温度环境下工作&#xff0c;足够快地实时读取或写入数据&#xff0c;是非易失性的。 MRAM速度快&#xff0…

华为-单臂路由

1、什么是单臂路由 单臂路由&#xff08;Single-Arm Routing&#xff09;是一种网络架构和配置技术&#xff0c;它允许路由器通过一个物理接口来管理多个虚拟局域网&#xff08;VLAN&#xff09;之间的通信。 这个物理接口被配置为Trunk模式&#xff0c;以便能够传输来自不同VL…

Redis缓存淘汰算法详解

文章目录 Redis缓存淘汰算法1. Redis缓存淘汰策略分类2. 会进行淘汰的7种策略2.1 基于过期时间的淘汰策略2.2 基于所有数据范围的淘汰策略 3. LRU与LFU算法详解4. 配置与调整5. 实际应用场景 LRU算法以及实现样例LFU算法实现1. 数据结构选择2. 访问频率更新3. 缓存淘汰4. 缓存插…

如何从huggingface下载

我尝试了一下若干步骤&#xff0c;莫名奇妙就成功了 命令行代理 如果有使用魔法上网&#xff0c;可以使用命令行代码&#xff0c;解决所有命令行连不上外网的问题&#xff1a; #配置http git config --global http.proxy 127.0.0.1:xxxx git config --global https.proxy 127…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——15.红黑树

1.红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff0c;…

专访 Bitlayer 联合创始人 Charlie:探索比特币 Layer2 技术的未来

整理&#xff1a;Tia&#xff0c;Techub News 在加密货币行业经历了近 10 年的风雨历程后&#xff0c;Bitlayer 联合创始人 Charlie Hu 凭借其在以太坊、波卡等顶级项目中的深厚经验&#xff0c;重新聚焦比特币生态&#xff0c;他与 Bitlayer 的另外一位联合创始人 Kevin He 通…

k8s搭建双主的mysql8集群---无坑

《k8s搭建一主三从的mysql8集群---无坑-CSDN博客》通过搭建一主三从&#xff0c;我们能理解到主节点只有1个&#xff0c;那么承担增删改主要还是主节点&#xff0c;如果你在从节点上去操作增删改操作&#xff0c;数据不会同步到其他节点。本章我们将实现多主&#xff08;双主&a…

YOLO11关键改进与网络结构图

目录 前言&#xff1a;一、YOLO11的优势二、YOLO11网络结构图三、C3k2作用分析四、总结 前言&#xff1a; 对于一个科研人来说&#xff0c;发表论文水平的高低和你所掌握的信息差有着极大的关系&#xff0c;所以趁着YOLO11刚刚发布&#xff0c;趁热了解&#xff0c;先人一步对…

Linux-基础实操篇-组管理和权限管理(上)

Linux 组基本介绍 在 linux 中的每个用户必须属于一个组&#xff0c;不能独立于组外。在 linux 中每个文件 有所有者、所在组、其它组的概念。 用户和组的基本概念&#xff1a; 用户名&#xff1a;用来识别用户的名称&#xff0c;可以是字母、数字组成的字符串&#xff0…

(Kafka源码五)Kafka服务端处理消息

Kafka 服务端&#xff08;Broker&#xff09;采用 Reactor 的架构思想&#xff0c;通过1 个 Acceptor&#xff0c;N 个 Processor(N默认为3)&#xff0c;M 个 KafkaRequestHandler&#xff08;M默认为8&#xff09;&#xff0c;来处理客户端请求&#xff0c;这种模式结合了多线…

kubeadm部署k8s集群,版本1.23.6;并设置calico网络BGP模式通信,版本v3.25--未完待续

1.集群环境创建 三台虚拟机&#xff0c;一台master节点&#xff0c;两台node节点 (根据官网我们知道k8s 1.24版本之后就需要额外地安装cri-dockerd作为桥接才能使用Docker Egine。经过尝试1.24后的版本麻烦事很多&#xff0c;所以此处我们选择1.23.6版本) 虚拟机环境创建参考…

【Android】浅析六大设计原则

【Android】浅析六大设计原则 六大设计原则是软件开发中常用的设计原则&#xff0c;用来帮助开发者编写灵活、可维护、可扩展的代码。它们是面向对象设计&#xff08;OOD&#xff09;的核心&#xff0c;遵循这些原则能够避免代码中的常见问题&#xff0c;比如代码难以修改、难…

Vue页面,基础配置

最简单页面 日期范围及字符搜索&#xff0c;监听器处理日期范围搜索控件清空重置问题导出、导出文件文件名称带日期时间表格日期指定格式显示。。。 <template><div class"app-container"><el-form :model"queryParams" ref"queryForm…

YOLOv11改进策略【损失函数篇】| Shape-IoU:考虑边界框形状和尺度的更精确度量

一、本文介绍 本文记录的是改进YOLOv11的损失函数&#xff0c;将其替换成Shape-IoU。现有边界框回归方法通常考虑真实GT&#xff08;Ground Truth&#xff09;框与预测框之间的几何关系&#xff0c;通过边界框的相对位置和形状计算损失&#xff0c;但忽略了边界框本身的形状和…

uboot笔记(一):概括/移植等

目录 前言一、下载地址二、目录介绍三、编译四、移植/适配五、启动流程 前言 本笔记以u-boot-2024.10-rc4代码、在arm64平台运行为例对uboot的介绍、编译、适配移植、运行过程的关键流程等&#xff1b; 一、下载地址 https://ftp.denx.de/pub/u-boot/ 下载自己想要使用的版本即…

并发编程三大特性(原子性、可见性、有序性)

并发编程的三大特性实际是JVM规范要求的JVM实现必须保证的三大特性 不同的硬件和不同的操作系统在内存管理上有一定的差异&#xff0c;JAVA为了解决这种差异&#xff0c;使用JMM&#xff08;Java Memry Model&#xff09;来屏蔽各个操作系统之间的差异&#xff0c;使得java可以…

关于malloc,calloc,realloc

1.引用的头文件介绍&#xff1a; 这三个函数需要调用<stdlib.h>这个头文件 2.malloc 2.1 函数简单介绍&#xff1a; 首先这个函数是用于动态开辟一个空间&#xff0c;例如数组在c99标准之前是无法arr[N]的&#xff0c;这个时候就需要使用malloc去进行处理&#xff0c…

互斥量mutex、锁、条件变量和信号量相关原语(函数)----很全

线程相关知识可以看这里: 线程控制原语(函数)的介绍-CSDN博客 进程组、会话、守护进程和线程的概念-CSDN博客 1.同步概念 所谓同步&#xff0c;即同时起步&#xff0c;协调一致。不同的对象&#xff0c;对“同步”的理解方式略有不同。如&#xff0c;设备同步&#xff0c;是…

【C语言指南】数据类型详解(上)——内置类型

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C语言指南》 期待您的关注 目录 引言 1. 整型&#xff08;Integer Types&#xff09; 2. 浮点型&#xff08;Floating-Point …

计算机毕业设计 基于Python高校岗位招聘和分析平台的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…