【TypeScript】类型声明及应用(二)

【TypeScript】类型声明及应用(二)



在这里插入图片描述

一、前言

TypeScript开发中需要对定义的变量指定类型,目前版本都支持哪些类型,每一个类型都有哪些含义,在这篇文章中,我们将会对其进行总结说明

二、JavaScript基本数据类型以及TypeScript特有的数据类型。

  • JS基本数据类型: String、Number、null、undefined、Boolean、Symbol
  • TS特有的数据类型:任意类型(any)、元组类型(tuple)、枚举类型(enum)、void类型、Never类型、never类型、数组类型(Array)、类型断言(Type Assertion)、接口类型(interface)、函数类型(Function)

具体分别含义如下

2.1 JavaScript(JS)基本数据类型包括:
  • 数字(Number):表示整数和浮点数,如 1、-2、3.14 等。
  • 字符串(String):表示文本数据,用单引号(')或双引号(")括起来,如 ‘hello’、“world” 等。
  • 布尔值(Boolean):表示真或假,只有两个值,true 和 false。
  • null:表示空值,即没有任何值的变量。
  • undefined:表示未定义,即变量声明了但没有赋值。
  • Symbol:表示唯一的标识符,通常用于对象属性的键名。

注意,JS 还有一种复杂数据类型,即对象(Object),它可以包含多个属性,每个属性是一个键值对。对象的属性可以是基本数据类型或其他对象,甚至可以是函数。

2.2 TypeScript 特有的数据类型包括:
  • 任意类型(any):表示可以是任何类型。
  • 元组类型(tuple):表示有限数量的未知类型元素的数组。
  • 枚举类型(enum):表示具有命名值的一组相关的常量。
  • void类型:表示没有任何类型,常用于函数的返回值类型。
  • never类型:表示永远不存在的值的类型。
  • unknown类型:表示任何类型的值,但在使用前必须先进行类型检查。
  • 类型断言(Type Assertion):表示在某些情况下需要手动告诉编译器变量的类型。
  • 接口类型(interface):表示对象的类型。
  • 函数类型(Function):表示函数的类型。

注意: node 不能直接执行 TypeScript 文件,需要先将 TypeScript 编译成 JavaScript,然后再执行 JavaScript 代码运行。

三、类型实践

3.1 String、Number、null、undefined、Boolean、Symbol类型声明

JavaScript常规写法

 let myName = "suwu150";let count = 1;let a = null;let b = undefined;let visiable = false;const nameShow = Symbol("foo");

TypeScript写法如下:

不能更改赋值给它们的变量类型,否则会直接报错

 let myName: string = "suwu150";let count: number = 1;let a: null = null;let b: undefined = undefined;let visiable: boolean = false;const nameShow: unique symbol = Symbol("foo");

编译后的结果:

"use strict";
let myName = "suwu150";
let count = 1;
let a = null;
let b = undefined;
let visiable = false;
const nameShow = Symbol("foo");

注意,这个结果是在官方在线演练场中编译后的结果,有些老铁可能会在本地终端使用tsc进行验证,会发现运行结果和我这个不一致,这是因为 tsconfig.json中配置如下:

{"compilerOptions": {"target": "ES5",  }
} 

在体验了正常定义之后,我们体验下,定义的类型和赋值类型有所差异的情况下,会有如下提示,继续编写TypeScript代码

 let myName: string = "suwu150";let count: number = 1;let a: null = null;myName = 2023;count = '平平安安'a = 888

继续编译看结果
在这里插入图片描述

3.2 元组类型(tuple)

JavaScript数组和TypeScript数组之间的区别

JS中的数组可以是字符串、数字等其他类型的数据,而TS中的数组是纯数字类型(number)的集合,如果在TS中定义包含多个类型的数组,那就是元组。

JS写法如下:

 let arr = ['语文','数学']

TS声明数组有多种方式,具体如下:

(1)数组的数据类型一致
  • Array<>:声明一个数组,数组类型为<>中定义的类型,比如:Array
  • string[] 声明一个数组,数组类型为[]前定义的类型,比如number[]
    //声明一个数组,并且数组中的数据类型都是字符串
    let arr:Array<string> = ['语文','数学']  
    let arrA:string[] =  ['语文','数学']  
    //注意:数组这样写会报错
    let arr:Array= ['语文','数学']  //error
(2)数组的数据类型不一致
  • 联合数据声明:比如(string|number)[],声明一个数组,数组类型为字符串、数字。数组中数据的类型可以不随定义的类型位置的限定。
    let arr:(string|number)[] = ['a',1]
    let arrB:(string|number)[] = ['a',11'b']
    let arrC:(string|number)[] = [11'b','c']
    let arrC:(string|number)[] = [11]
    //或者这样声明
    let arrD: Array<string | number> = [1, 12, 'a']
(3)数组的数据类型任意
  • 数组内包含多种类型

    let arr:any[] = ['a',1,true,null]
    //或者这样声明
    let arrE:Array<any> = ['a',1,true,null]
(4)限制类型和长度的元祖数组
  • tuple(元祖):是固定数量的不同类型的元素的组合,比如[number, string]。数组中数据的位置、类型以及个数必须要和声明的类型、声明类型的位置、声明类型的个数保持一致,否则就会报错。

    let tupleArr: [number, string] = [1, '数学']
    let tupleArrA: [number, string] = [1, '数学',1]//error
    let tupleArrA: [number, string] = ['数学',1]//error
3.3 枚举类型(enum)

枚举主要分为数字类型枚举、字符串类型枚举、异构。
语法:enum + 变量名,意思是定义了一个叫做“变量名”的枚举类型
优点:定义一些常量,可以清晰地表达意图或创建一组有区别的用例。

(1)数字型枚举
  • 含义:枚举成员都是number类型,如果没有对枚举对象中的枚举成员赋值,那么会默认从枚举对象中的第一个枚举成员的值是0,并依次递增。
  • 具有以下特点:
    • 反向映射

    • 枚举成员的值可以不用初始化

      enum Value {A,B,C,D,E,F
      }let value: Value = Value['A']
      let valueName = Value[0]
      console.log(value)//0
      console.log(valueName)//A

以上可知,我们既可以取到枚举成员的属性名,也能取到枚举成员的属性值,它们之间是相互映射的。

  • 修改枚举成员的默认值

    enum Value {A,B,C=8,D,E,F
    }let value: Value = Value['E']
    let valueNameA = Value[8]
    let valueNameB = Value[9]
    console.log(value)//10
    console.log(valueNameA) //C
    console.log(valueNameB) //Dconsole.log(Value['A']) //0
    console.log(Value['B']) //1
    console.log(Value['C']) //8
    console.log(Value['D']) //9
    console.log(Value['E']) //10

    以上TypeScript内容编译后结果我们能够清楚地看到,其实在赋值之前还是按照0序号开始,当有指定索引时才按照指定的排序

    "use strict";
    var Value;
    (function (Value) {Value[Value["A"] = 0] = "A";Value[Value["B"] = 1] = "B";Value[Value["C"] = 8] = "C";Value[Value["D"] = 9] = "D";Value[Value["E"] = 10] = "E";Value[Value["F"] = 11] = "F";
    })(Value || (Value = {}));
    var value = Value['E'];
    var valueNameA = Value[8];
    var valueNameB = Value[9];
    console.log(value); //10
    console.log(valueNameA); //C
    console.log(valueNameB); //D
    console.log(Value['A']); //0
    console.log(Value['B']); //1
    console.log(Value['C']); //8
    console.log(Value['D']); //9
    console.log(Value['E']); //10
    
(2)字符串类型枚举
  • 含义:枚举成员类型都是字符串
    需要注意以下几个方面:

    • 字符串枚举没有反向映射,如果进行反向映射的话,取得的值时undefined;

    • 字符串枚举没有递增,需要对每一个字符串枚举类型成员进行赋值,即必须具有初始化表达式

      enum StringValue {A = 'A',B = 'B',C = 'C',D = 'D',E = 'E',F = 'f'
      }let stringValueVal = StringValue['A']
      console.log(stringValueVal)//A
      
    • 以下是错误示范,不能对字符串类型枚举进行反向映射

      let stringValueNameA = StringValue['f']
      let stringValueNameB = StringValue[0]
      console.log(stringValueNameA)//undefined
      console.log(stringValueNameB)//undefined
(3)异构
  • 含义:枚举类型包括字符串类型和数字类型

  • 注意:含有字符串值成员的枚举中也可以使用计算值。

    enum Enum {A,B,C = 'C',D = 'd',E = 9,F
    }
    console.log(Enum['10'])//F
    console.log(Enum['C'])//C
    console.log(Enum['A'])//0
    console.log(Enum['d'])//undefined
    console.log(Enum['D'])//d
    console.log(Enum[9])//E
    console.log(Enum[0])//A
    

以上就是一个典型的异构,包含字符串和数字类型值。

同时注意,含有字符串成员值的枚举中允许使用计算值。

enum Count {A = 12 * 2,B = 24 * 2}
console.log(Count['A']) // 24
console.log(Count['B']) // 48

这种写法没问题,即可以使用计算值,也可以包含字符串值。


enum Count {A,B = 24 * 2,C = 'c-suwu150',D = 48 * 2,}console.log(Count['A']) // 0console.log(Count['B']) // 48console.log(Count['C']) // c-suwu150console.log(Count['D']) // 96 
(4)枚举成员的值的两种形式-计算值和常量
  • 枚举对象中成员的value有两种形式,计算值或者常量,怎么区分是计算值和常量呢?我们可以通过枚举成员表达式来判断,只要是枚举成员是表达式则为常量。枚举成员表达式的判断条件如下:

    • 枚举表达式字面量(主要是字符串字面量或数字字面量)
    • 对之前定义的常量枚举成员的引用
    • 带括号的常量枚举表达式
    • 一元运算符 ++、 –
    • 常量枚举表达式是二元运算符 + 、-、*、/、%、<<、>>、&、|、^的操作对象。注意:如果求值后值为NaN或Infinity,那么会在编译阶段报错。
3.4 任意类型(any)

声明变量类型为any时

  • 编译时会绕过所有类型的检测,直接通过编译阶段的检查

  • 可以任意访问属性的方法和属性

  • any类型可以赋值给任意类型

  • 如果变量初始没有定义类型,默认为any;经过赋值后,TS会根据赋值类型来标识变量的类型

    let anyValue: any = 1;
    //修改变量类型
    anyValue = true;
    //赋值给任意类型,比如boolean,之后再赋值,就只能赋值boolean类型,否则异常
    let booleanValue: boolean = anyValue;
    console.log(booleanValue)//true
    

注意: any类型在使用过程中就像一个潘多拉魔盒,即使使用了断言,也丧失了在静态类型检查阶段发现错误的可能性。

3.5 unknow(未知类型)

声明变量类型为unknow时

  • unknown类型只能赋值给any和unknown类型,any类型可以赋值给任意类型

    let unknownValue: unknown;
    //对变量进行任意赋值
    unknownValue = true;
    unknownValue = 'sss';
    unknownValue = 1;
    //赋值给unknown类型的变量
    let testValue1: unknown = unknownValue;
    //赋值给any类型的变量
    let testValue2: any = unknownValue;//赋值给boolean类型的变量,报错,因为unknown类型只能赋值给unknown、any
    let testValue3: boolean = unknownValue;//报错
    
3.6 void(空类型)

声明对象类型为void时

  • 返回为空值

    function func(): void { }
    
  • 只能将它赋值为 undefined 和 null,因此在定义函数的返回值为void时,也可return undefined/null

    let voidValue1: void = undefined;
    let voidValue2: void = null;
    
3.7 never(不存在的值类型)

never类型表示永不存在的值的类型。具有以下特点:

  • never类型是所有类型的子类型,即never类型可以赋值给任何类型。
  • 其他任何类型均不是never类型的子类型,即其他类型均不可赋值给never类型,除了never本身。即使any类型也不可以赋值给never类型。
  • 返回类型为never的函数中,其终点必须是不可执行的,例如函数过程中抛出了错误或者存在死循环。
  • 变量也可以声明为never类型,但其不能被赋值

设置变量类型为never,表示永远不能执行完或者永远Error,具体示例如下:

  • 函数中出现了死循环,永远不能执行完,因此其函数类型为:() => never

    function infiniteLoop(): never {while (true) { }return 'over'
    }
    
  • 函数中出现报错,不会执行到return over,因此其函数类型为:() => never

    
    function errFunc(): never {throw new Error()return 'over'
    }

以上就是类型声明和应用,感兴趣的同学帮忙来个点赞关注,谢谢。


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

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

相关文章

Quartz使用文档,使用Quartz实现动态任务,Spring集成Quartz,Quartz集群部署,Quartz源码分析

文章目录 一、Quartz 基本介绍二、Quartz Java 编程1、文档2、引入依赖3、入门案例4、默认配置文件 三、Quartz 重要组件1、Quartz架构体系2、JobDetail3、Trigger&#xff08;1&#xff09;代码实例&#xff08;2&#xff09;SimpleTrigger&#xff08;3&#xff09;CalendarI…

腾讯云从业者认证考试考点——云网络产品

文章目录 腾讯云网络产品功能网络产品概述负载均衡&#xff08;Cloud Load Balancer&#xff09;私有网络&#xff08;Virtual Private Cloud&#xff0c;VPC&#xff09;专线接入弹性网卡&#xff08;多网卡热插拔服务&#xff09;NAT网关&#xff08;NAT Gateway&#xff09;…

安全文件传输的重要性及其对企业的影响

在当今的信息时代&#xff0c;企业之间的文件传输已经成为日常工作的重要组成部分。无论是在商务合作、人力资源还是财务审计等方面&#xff0c;文件传输都发挥着关键的作用。然而&#xff0c;随着网络技术的发展&#xff0c;网络安全问题也日益突出&#xff0c;泄漏、篡改、丢…

用思维导图带你解读电子商务数据分析基本指标,产品、运营者必看

随着时代的发展&#xff0c;越来越多的人参与到电商之中。电商即电子商务&#xff0c;是依托现代信息网络技术&#xff0c;以商品交换为中心的新型商务贸易活动。电商可并不简单&#xff0c;做好电商又有哪些关键呢&#xff1f;别急&#xff0c;再此之前&#xff0c;需要先了解…

ViT-vision transformer

ViT-vision transformer 介绍 Transformer最早是在NLP领域提出的&#xff0c;受此启发&#xff0c;Google将其用于图像&#xff0c;并对分类流程作尽量少的修改。 起源&#xff1a;从机器翻译的角度来看&#xff0c;一个句子想要翻译好&#xff0c;必须考虑上下文的信息&…

leetcode每日一练-第102题-二叉树的层序遍历

一、思路 BFS 二、解题方法 通过广度优先搜索&#xff08;BFS&#xff09;的方式&#xff0c;按层遍历二叉树节点&#xff0c;并将每层的节点值保存在一个一维数组中&#xff0c;然后再将所有的一维数组存储在二维数组中&#xff0c;最后返回二维数组作为层序遍历的结果。 …

掌握无人机遥感数据预处理的全链条理论与实践流程、典型农林植被性状的估算理论与实践方法、利用MATLAB进行编程实践(脚本与GUI开发)以及期刊论文插图制作等

目录 专题一 认识主被动无人机遥感数据 专题二 预处理无人机遥感数据 专题三 定量估算农林植被关键性状 专题四 期刊论文插图精细制作与Appdesigner应用开发 近地面无人机植被定量遥感与生理参数反演 更多推荐 遥感技术作为一种空间大数据手段&#xff0c;能够从多时、多…

【英杰送书第三期】Spring 解决依赖版本不一致报错 | 文末送书

Yan-英杰的主 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 问题描述 报错信息如下 报错描述 解决方法 总结 【粉丝福利】 【文末送书】 目录&#xff1a; 本书特色&#xff1a; 问题描述 报错信息如下 Description:An attempt…

重新理解 RocketMQ Commit Log 存储协议

最近突然感觉&#xff1a;很多软件、硬件在设计上是有 root reason 的&#xff0c;不是 by desgin 如此&#xff0c;而是解决了那时、那个场景的那个需求。一旦了解后&#xff0c;就会感觉在和设计者对话&#xff0c;了解他们的思路&#xff0c;学习他们的方法&#xff0c;思维…

【Hadoop 01】简介

目录 1 Hadoop 简介 2 下载并配置Hadoop 2.1 修改/etc/profile 2.2 修改hadoop-env.sh 2.3 修改core-site.xml 2.4 修改hdfs-site.xml 2.5 修改mapred-site.xml 2.6 修改yarn-site.xml 2.7 修改workers 2.8 修改start-dfs.sh、stop-dfs.sh 2.9 修改start-yarn.sh、s…

Spring MVC拦截器和跨域请求

一、拦截器简介 SpringMVC的拦截器&#xff08;Interceptor&#xff09;也是AOP思想的一种实现方式。它与Servlet的过滤器&#xff08;Filter&#xff09;功能类似&#xff0c;主要用于拦截用户的请求并做相应的处理&#xff0c;通常应用在权限验证、记录请求信息的日志、判断用…

小研究 - 微服务系统服务依赖发现技术综述(二)

微服务架构得到了广泛的部署与应用, 提升了软件系统开发的效率, 降低了系统更新与维护的成本, 提高了系统的可扩展性. 但微服务变更频繁、异构融合等特点使得微服务故障频发、其故障传播快且影响大, 同时微服务间复杂的调用依赖关系或逻辑依赖关系又使得其故障难以被及时、准确…

自监督去噪:Noise2Void原理和调用(Tensorflow)

文章原文: https://arxiv.org/abs/1811.10980 N2V源代码: https://github.com/juglab/n2v 参考博客&#xff1a; https://zhuanlan.zhihu.com/p/445840211https://zhuanlan.zhihu.com/p/133961768https://zhuanlan.zhihu.com/p/563746026 文章目录 1. 方法原理1.1 Noise2Noise回…

服务器数据恢复-raid5同步过程中又有一块磁盘报警的数据恢复案例

服务器数据恢复环境&#xff1a; 某研究院一台DELL存储&#xff0c;15块硬盘搭建的一组RAID5磁盘阵列。 该RAID5阵列只有一个卷组&#xff0c;该卷组占用了阵列的全部空间&#xff1b;该卷组只有一个起始位置为0扇区的XFS裸分区。 服务器故障&初检&分析&#xff1a; 该…

Spring Cloud Gateway - 新一代微服务API网关

Spring Cloud Gateway - 新一代微服务API网关 文章目录 Spring Cloud Gateway - 新一代微服务API网关1.网关介绍2.Spring Cloud Gateway介绍3.Spring Cloud Gateway的特性4.Spring Cloud Gateway的三大核心概念5.Gateway工作流程6.Gateway核心配置7.动态路由8.Predicate自定义P…

kafka第三课-可视化工具、生产环境问题总结以及性能优化

一、可视化工具 https://pan.baidu.com/s/1qYifoa4 密码&#xff1a;el4o 下载解压之后&#xff0c;编辑该文件&#xff0c;修改zookeeper地址&#xff0c;也就是kafka注册的zookeeper的地址&#xff0c;如果是zookeeper集群&#xff0c;以逗号分开 vi conf/application.conf 启…

Rust 数据类型 之 结构体(Struct)

目录 结构体&#xff08;Struct&#xff09; 定义与声明 结构体定义 结构体实例 结构体分类 单元结构体&#xff08;Unit Struct&#xff09; 元组结构体&#xff08;Tuple Struct&#xff09; 具名结构体&#xff08;Named Struct&#xff09; 结构体嵌套 结构体方法…

公网访问的Linux CentOS本地Web站点搭建指南

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道&#xff0c;指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…

总结946

6:40起床 7&#xff1a;15~8:00早读&#xff0c;07年tex1,2 8:10~10:12 880第二章选填&#xff0c;题目有些综合&#xff0c;错的有些多呀&#xff0c;不要紧&#xff0c;拿下它&#xff0c;就有进步了。 10:28~11:27重做强化18讲6道题 12&#xff1a;10~2:15吃饭睡觉&…

Python实现GA遗传算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…