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

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

相关文章

Python查漏补缺

1.冒泡排序 时间复杂度O&#xff08;n^2) 选择、插入都是 def bubble(data, reverse):for i in range(len(data)-1):for j in range(len(data)-i-1):if data[j] > data[j1]:data[j], data[j1] data[j1], data[j]if reverse:data.reverse()return data 2.快速排序 时间…

QT将QBytearray的data()指针赋值给结构体指针变量后数据不正确的问题

1、问题代码 #include <QCoreApplication>#pragma pack(push, 1) typedef struct {int a; // 4字节float b; // 4字节char c; // 1字节int *d; // 8字节 }testStruct; #pragma pack(pop)#include <QByteArray> #include <QDebug>int main() {testStruct …

ros2安装完成后重要的一步

安装完成ros2之后&#xff0c;每次打开新的终端都需要 source /opt/ros/humble/setup.bash 为了解决这个为题&#xff0c;我们需要做如下操作,避免每次打开一个新的在终端都要设置。 在文件的最后一行添加 source /opt/ros/foxy/setup.bash

职称评审难在哪?

没有项目业绩资料&#xff1f; 社保不符合&#xff1f; 看不懂评审文件&#xff1f; 申报材料不会做&#xff1f; 论文没地发表&#xff1f; 有这些疑问的 评论区滴滴

如何使用ssm实现白云会议管理系统+vue

TOC ssm741白云会议管理系统vue 第1章 绪论 1.1 选题动因 到现在为止&#xff0c;互联网已经进入了千家万户&#xff0c;最普通的平民百姓也有属于自己的智能设备&#xff0c;计算机各种技术的储备也是相当的丰富&#xff0c;并且实现也是没有难度&#xff0c;各行各业&…

MFU简介

1、缩写 MFU - Mask Field Utilization&#xff08;光刻掩膜版有效利用比例&#xff09; GDPW - Gross Die Per Wafer&#xff0c;每张wafer上die的数量 2、什么是MASK 在光刻机中&#xff0c;光源&#xff08;紫外光、极紫外光&#xff09;透过mask曝光在晶圆上形成图…

python12_字符类型转换

字符类型转换 # 整型 A 3.14 B "123" C True D False E "3.14" F "True" G 0.0# 整型转换函数 def to_int(m):int_m int(m)return int_m# 布尔转换为整型 def bool_to_int(m):bool_m int(m)return bool_m# 布尔类型转换为字符串 def b…

SQL增删查改操作

目录 数据库概述 SQL基础操作 SQL通用语法 数据类型 SQL语句的分类 DDL(数据库定义,表定义,字段定义) 数据库操作 表操作 DDL小结 DML(数据的增删改,数据操作语言) DQL(查询) DQL小节 数据库概述 数据库,顾名思义就是用来存储和管理数据的,我们平时所使用的各大软…

如何通过开源工具帮助保护您的计算机安全

引言 如果您正在考虑安全问题&#xff0c;您有很多选择。随着当前网络犯罪的激增&#xff0c;以及发生犯罪时常见的重大后果&#xff0c;许多企业开始关注如何在网络世界中保护公民的安全。网络安全行业蕴藏着巨大的商业利益&#xff0c;但您可能会惊讶地发现&#xff0c;有一…

TCP CUBIC 曲线对 BIC 折线的拟合

bic 旨在对 reno 改进&#xff0c;用二分逼近替换线性遍历逼近&#xff0c;时间规模从 O ( W m a x ) O(W_{max}) O(Wmax​) 下降到 O ( ln ⁡ W m a x ) O(\ln {W_{max}}) O(lnWmax​)&#xff0c;这是本质&#xff0c;而 cubic 可以看作对 bic 的 bugfix&#xff0c;解除了…

Activity

69[toc] 1.启停活动页面 1.Activity启动和结束 从当前页面跳到新页面 startActivity(new Intent(this, ActFinishActivity.class));从当前页面返回上一个页面&#xff0c;相当于关闭当前页面 finish();2.Activity生命周期 官方描述生命周期 onCreate&#xff1a;创建活…

解决 Could not locate zlibwapi.dll. Please make sure it is in your library path

zlibwapi.dll文件是zlib库的Windows版本&#xff0c;很多Python上的库想要在Windows上执行都需要依赖这个文件。 可以通过本人上传的免费资源直接下载&#xff1a;zlibwapi 链接&#xff1a;https://pan.baidu.com/s/1u8osbt_IevO4GOkXthZ04A 提取码&#xff1a;c2mf zlibwa…

基于Jenkins+Python+Ubuntu+Docker的接口/UI自动化测试环境部署详细过程

1 Jenkins是什么&#xff1f; 学习官网&#xff1a;Jenkins官网&#xff0c;Jenkins中文官网&#xff1b; Jenkins是一款开源 CI&CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测试和部署软件&#xff1b; 用Java语言编写的&#xff0c;可在Tomcat、Dock…

4.2.1 通过DTS传递物理中断号给Linux

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 4.2.1 通过DTS传递物理中断号给Linux 参考《GICv3_Software_Overview_Official_Release_B》&#xff0c;下表描述了GIC V3支持的INTID(硬件中断号)的范围。 SGI (Software Generated Interrupt)&#xff1a;软…

【C/C++】 秋招常考面试题最全总结(让你有一种相见恨晚的感觉)

目录 1.C程序编译链接过程 2.浅拷贝和move有区别吗 3.深拷贝和浅拷贝的区别 4.空类的大小 5.类的继承有几种方式&#xff0c;区别是什么&#xff1f; 六、extern 关键字的作用 七、static关键字的作用 八、指针和引用的区别 九、C内存分配方式 十、结构体对齐…

33 指针与数组:数组名与指针的关系、使用指针遍历数组、数组指针、指针数组、字符指针

目录​​​​​​​ 1 数组名与指针的关系 1.1 数组名 1.2 对数组名取地址 1.3 数组名与指针的区别 1.3.1 类型不同 1.3.2 sizeof 操作符的行为不同 1.3.3 & 操作符的行为不同 1.3.4 自增自减运算的行为不同 1.3.5 可变性不同 2 使用指针遍历数组 2.1 使用 *(nu…

硬布线控制器与微程序控制器

硬布线控制器和微程序控制器都是控制单元&#xff08;CU&#xff09;的实现方式&#xff0c;用于协调和控制计算机系统的操作。它们的主要区别在于控制信号的生成方式&#xff1a; 硬布线控制器 (Hardwired Controller): 概念: 硬布线控制器使用组合逻辑电路直接生成控制信号…

自己做个国庆75周年头像生成器

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 下载相关代码&#xff1a;【免费】《自己做个国庆75周年头像生成器》代码资源-CSDN文库 又是一年国庆节&#xff0c;今年使用国旗做…

《情书》你的名字,是最美的情书

《情书》你的名字&#xff0c;是最美的情书 岩井俊二&#xff0c;日本电影导演&#xff0c;作家及记录片导演。被誉为日本最有潜质的新近“映像作家”&#xff0c;也有中国影迷称他为“日本王家卫”。影像清新独特、感情细腻丰富。&#xff08;来自豆瓣&#xff09; 穆晓芳 译 …

总结C/C++中内存区域划分

目录 1.C/C程序内存分配主要的几个区域&#xff1a; 2.内存分布图 1.C/C程序内存分配主要的几个区域&#xff1a; 1、栈区 2、堆区 3、数据段&#xff08;静态区&#xff09; 4.代码段 2.内存分布图 如图&#xff1a; static修饰静态变量成员——放在静态区 int globalVar 是…