【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',1,1,'b'] let arrC:(string|number)[] = [1,1,'b','c'] let arrC:(string|number)[] = [1,1] //或者这样声明 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' }
以上就是类型声明和应用,感兴趣的同学帮忙来个点赞关注,谢谢。
相关文章:
【TypeScript】类型声明及应用(二)
【TypeScript】类型声明及应用(二) 一、前言 TypeScript开发中需要对定义的变量指定类型,目前版本都支持哪些类型,每一个类型都有哪些含义,在这篇文章中,我们将会对其进行总结说明 二、JavaScript基本数据…...
rust from_utf8_lossy怎么使用?
from_utf8_lossy 是Rust标准库中的一个方法,用于将字节序列解码为UTF-8字符串。它的作用是尽可能地将无效的字节序列转换为有效的Unicode字符,以便进行后续处理。 以下是使用 from_utf8_lossy 方法的示例代码: fn main() {let bytes b"…...
#P0997. [NOIP2006普及组] 数列
题目描述 给定一个正整数k(3≤k≤15)k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k3k3时,这个序列是: 1,3,4,9,10,12,13,…1,3,4,9,10,12,13,… (该序列实际上就是&…...
做完两年外包,感觉自己废了一半....
先说一下自己的情况。大专生,17年通过校招进入湖南某软件公司,干了接近2年的点点点,今年年上旬,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了五年的功能测试…...
Kubernetes系列-Ingress
1 Ingress 概述 Kubernetes 对外暴露服务(Service)主要有两种方式:NodePort,LoadBalance,此外 externalIps 也可以使各类 service 对外提供服务,但是当集群服务很多的时候,NodePort方式最大的缺…...
软件测试之Docker常见问题汇总!附解决方法!
1、配置国内源进行docker安装,报错 HTTP Error 404 - Not Found 【整整200集】超超超详细的Python接口自动化测试进阶教程,真实模拟企业项目实战!! 原因: 由于配置国内镜像源时,把地址写错了,导…...
Python-操作Excel表-openpyxl模块使用
openpyxl简介 openpyxl是一个强大的Python库,用于读写Excel(xlsx/xlsm/xltx/xltm)文件。 主要功能和特点如下: 读取、修改、写入Excel文件,支持格式如xlsx、xlsm等支持 Excel 2003 以上格式可以很方便地遍历工作表中的行和列获取单元格对象后,可以修改单元格的值、样式、格式…...
向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录
1、注册https://issues.sonatype.org/账号 下面就代表注册好了,同时提交的工单也通过了 2、这里主要是goupId 需要进行认证,需要到域名注册商近一个txt的解析,以便确保这个是你的 通过下面来验证你的域名信息,这里主要是上面的工…...
【HDFS】Block、BlockInfo、BlockInfoContiguous、BlockInfoStriped的分析记录
本文主要介绍如下内容: 关于几个Block类之间的继承、实现关系;针对文章标题中的每个类,细化到每个成员去注释分析列出、并详细分析BlockInfo抽象类提供的抽象方法、非抽象方法的功能针对几个跟块组织结构的方法再进行分析。moveBlockToHead、listInsert、listRemove等。一、…...
STM32 LoRa(学习二)
LoRa关键参数说明 LoRa数据包由三个部分组成:前导码、可选报头、数据有效负载。 前导码:用于保持接收机与输入的数据流同步。默认情况下,数据包含有12个符号长度的前导码。前导码是一个可以通过编程来设置的变量,所以前导码的长度…...
ASP.NET Core学习路线图
说明 1. 先决条件 - [C#](https://www.pluralsight.com/paths/csharp) - [Entity Framework](https://www.pluralsight.com/search?qentity%20framework%20core) - [ASP.NET Core](https://www.pluralsight.com/search?qasp.net%20core) - SQL基础知识 2. 通用开发技能 -…...
无涯教程-Lua - for语句函数
for 循环是一种重复控制结构,可让您有效地编写需要执行特定次数的循环。 for loop - 语法 Lua编程语言中 for 循环的语法如下- for init,max/min value, increment dostatement(s) end 这是 for 循环中的控制流程- 首先执行 init 步骤,并且仅执行一…...
二叉树的相关题目
目录 1、根据二叉树创建字符串 2、二叉树的层序遍历 3、二叉树的最近公共祖先 4、搜索二叉树与双向链表 5、从前序与中序遍历序列构造二叉树 6、 从中序与后序遍历序列构造二叉树 7、二叉树的前序遍历(非递归实现) 8、二叉树的中序遍历(…...
【antd之tabs踩坑篇】Tabs有items时切换不起作用
<TabsdefaultActiveKey"1"tabPosition{mode}style{{ height: 220 }}items{new Array(30).fill(null).map((_, i) > {const id String(i);return {label: Tab-${id},key: id,disabled: i 28,children: Content of tab ${id},};})}/>官网上如果tabs有很多it…...
简单模拟livedata数据倒灌
简单模拟livedata数据倒灌 数据倒灌,就是将旧的或只展示一次的数据再次展现出来。 livedata内部通过版本号更新可见视图数据,而在view在活跃与不活跃之间反复横跳时,livedata也会通知数据。 class MainActivity : AppCompatActivity() {pri…...
python爬虫-加速乐cookie混淆解析实例小记
注意!!!!某XX网站逆向实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!! 第一步:抓包工具第一次请求页面,得到响应。本次我使用的fiddle进行抓包&#…...
TensorFlow 中前缀 prefix
前缀 prefix 主要用于命名 TensorFlow 中的变量,以避免变量名冲突。在 TensorFlow 中,每个变量都有一个唯一的名称,由变量的作用域和变量的名称组成。作用域可以通过 tf.variable_scope() 函数来创建,而变量的名称通常是由用户指定…...
SystemVerilog scheduler
文章目录 简介调度器simulation regionPreponed regionActive regionInactive regionNBA(Non-blocking Assignment Events region)Observed regionReactive regionRe-Inactive Events regionRe-NBA RegionPostponed Region PLI region:Pre-active regionPre-NBA regionPost-NBA…...
Qt 5. QSerialPort串口收发
1. 代码 //ex2.cpp #include "ex2.h" #include "ui_ex2.h" #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo>int static cnt 0;Ex2::Ex2(QWidget *parent): QDialog(parent), ui(new Ui::Ex2) {ui->setupUi…...
什么是Java中的JVMTI(JVM Tool Interface)?
Java中的JNI(Java Native Interface)和JVMTI(JVM Tool Interface)都是与Java运行时环境(JVM)交互的工具,但它们有不同的目的和使用场景。下面我从新手的角度来幽默地解释一下它们的区别和用途。…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
