TypeScript 学习笔记 — 类型补充void,any, tuple ,enum,nerver, Symbol , BigInt ,unknown(三)
空值void 及(与Null 和 Undefined的区别)
JavaScript 没有空值(Void)的概念,在 TS中,用 void 表示没有任何返回值的函数:
function alertName(): void {
alert('My name is Tom');
}
然而声明一个 void 类型的变量没什么用,因为只能将其赋值为 undefined 和 null:
let unusable: void = undefined;
Null 和 Undefined
let u: undefined = undefined;
let n: null = null;
区别:undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给所有类型的变量,包括 void 类型:
let num: number = undefined;
let u: undefined;
let str: string = u;
let vo: void= u;
// 编译通过
而 void 类型的变量不能赋值给其他类型的变量,只能赋值给 void 类型:
let u: void;
let num: number = u; // Type 'void' is not assignable to type 'number'.
let vo: void = u; // 编译通过
任意值Any
任意值(Any)用来表示允许赋值为任意类型。一个普通类型,在赋值过程中是不被允许改变类型的,any 类型,允许被赋值为任意类型。
let str: string = 'abc';
str = 123;
// Type 'number' is not assignable to type 'string'.
// -----------------------------------------------------------------
let str: any = 'abc';
str = 123;
// 编译通过
任意值可以访问任意属性和方法:
let anyThing: any = 'hello';
anyThing.setName('Jerry');
anyThing.setName('Jerry').sayHello();
anyThing.myName.setFirstName('Cat');
console.log(anyThing.myName);
console.log(anyThing.myName.firstName);
// 编译通过
未声明类型的变量:如果变量在声明时,未指定类型,那么会被识别为任意值类型:
let something;
something = 'seven';
something = 7;
// 等价于
let something: any;
something = 'seven';
something = 7;
元组类型
元组最重要的特性是可以限制数组元素的个数和类型,可以通过数组的方法进行新增。只能新增已经存在的类型。
let tuple: [name: string, age: number, male: boolean] = ["yya", 18, false];
let username = tuple[3]; // 此时添加新元素,但是取不到 会抛异常
console.log(tuple[3]); // error 长度为 "3" 的元组类型 "[string, number, boolean]" 在索引 "3" 处没有元素。
枚举类型
自带类型的对象, 枚举的值如果没有赋值,默认从 0 开始递增. 并且只能在值为数字的情况下反举。
作用:代码中常量、状态码 、接口的定义、权限、标示位等可以采用枚举类型,提示友好,使用方便。
enum USER_ROLE { //
USER = "a",
ADMIN = 10,
SUPER_ADMIN,
}
console.log(USER_ROLE.USER);
上述枚举 ts 代码,编译为 js,会生成一个对象,并实现反举(值为数字时):
var USER_ROLE;
(function (USER_ROLE) {
USER_ROLE["USER"] = "a";
USER_ROLE[(USER_ROLE["ADMIN"] = 10)] = "ADMIN";
USER_ROLE[(USER_ROLE["SUPER_ADMIN"] = 11)] = "SUPER_ADMIN";
})(USER_ROLE || (USER_ROLE = {}));
console.log(USER_ROLE.USER);
常量枚举
区别:常量枚举不能反举,一般用不到反举的情况下,都采用常量枚举,编译后的结果,不会生成对象,而是直接将值取出来。
写法上有些许不同,就是使用的const 关键字进行常量的声明
const enum USER_ROLE { //
USER = "a",
ADMIN = 10,
SUPER_ADMIN,
}
console.log(USER_ROLE.USER);
编译为 js 代码,并不会生成一个对象:
console.log("a" /* USER_ROLE.USER */);
never 类型
任何类型的子类型,never 代表不会出现的值。不能把其他类型赋值给 never
1. 函数无法到达终点
// 循环不停止的情况
function whileTrue(): never {
while (true) {}
}
// 或者抛出异常的情况
function throwError(): never {
throw new Error();
}
function test() {
throwError();
let a = 1; // 此行代码会置灰,并提示 检测到无法访问的代码。
}
2.通常校验逻辑的完整性,可以利用 never 类型
function getResult(param: string | number | boolean) {
if (typeof param === "string") {
return param.split("");
} else if (typeof param == "number") {
return param.toString().split("");
} else if (typeof param == "boolean") {
return param.toString().split("");
} else {
// 如果达不到never 则可以正常的运行
// 如果参数类型判断缺失boolean,则会抛出异常,不能将类型“boolean”分配给类型“never”。
let n: never = param;
}
}
Symbol 类型
Symbol 表示独一无二
const s1 = Symbol("key");
const s2 = Symbol("key");
console.log(s1 == s2); // false
BigInt 类型
当数值类型超出安全数值时,使用 bigInt 类型
const num1 = Number.MAX_SAFE_INTEGER + 1;
const num2 = Number.MAX_SAFE_INTEGER + 2;
console.log(num1 == num2); // true
let max: bigint = BigInt(Number.MAX_SAFE_INTEGER);
console.log(max + BigInt(1) === max + BigInt(2)); // false
unknown 类型
unknown 类型,任何类型都可以赋值为 unknown 类型。 它是 any 类型对应的安全类型,
any:不进行类型检测
unknown:还是会检测, 但在没有确定类型之前不能操作。(不能当做函数、类、对象来使用)
let unknown: unknown;
unknown = "18";
unknown.toString(); // 报错:对象的类型为 "unknown"
联合类型中的 unknown:联合类型与 unknown 都是 unknown 类型
type UnionUnknown = unknown | null | string | number; // type UnionUnknown = unknown
交叉类型中的 unknown:交叉类型与 unknown 都是其他类型
type interUnknown = unknown & null; // type interUnknown = null
never 是 unknown 的子类型
type isNever = never extends unknown ? true : false; // type isNever = true
keyof unknown 是 never
type key = keyof unknown; // type key = never
TypeScript 学习笔记 — 类型补充void,any, tuple ,enum,nerver, Symbol , BigInt ,unknown(三)的更多相关文章
- TypeScript 学习笔记 — 类型兼容 (十)
目录 一.基本数据类型的兼容性 二.接口兼容性 三.函数的兼容性 四.类的兼容性 类的私有成员和受保护成员 五.泛型的兼容性 六.枚举的兼容性 标称类型简短介绍 TS 是结构类型系统(structur ...
- Typescript 学习笔记二:数据类型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记三:函数
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记一:介绍、安装、编译
前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...
- TypeScript学习笔记(八):1.5版本之后的模块和命名空间
我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块 但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以 ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- typescript学习笔记(一)---基础变量类型
作为一个前端开发者,学习新技术跟紧大趋势是必不可少的.随着2019年TS的大火,我打算利用一个月的时间学习这门语言.接下来的几篇文章是我学习TS的学习笔记,其中也会掺杂一些学习心得.话不多说,先从基础 ...
随机推荐
- pageoffice6 在线编辑 word 文件时禁止拷贝到外部
有些特殊情况下,希望用户可以在线编辑Word文档,也允许用户拷贝本地电脑或网络上的资料到Word文档中进行编辑,但是不希望用户把在线Word文档中的内容另存到本地或选择并拷贝出去,此时只是禁用另存.禁 ...
- java学习之旅(day.19)
多线程 线程简介 多任务:同时做多件事 进程(Process):在操作系统中运行的程序就是进程,如QQ,播放器,游戏. 线程(Thread):一个进程可以有多个线程,如视频中同时听声音,看弹幕,看图像 ...
- C# dynamic动态对象赋值
dynamic 如果接收的是匿名对象,是无法为属性赋值的,而如果是接收的定义对象,又无法扩展字段. 解决办法序列化为json字符串,然后用Dictionary反序列化,就能赋值了.也能扩展新的字段. ...
- 【winform】【Socket】实现你画我猜一:核心功能开发
我认为得核心:是把客户端画的图画实时传递给其他的客户端. 我的思路是: 1.GDI+绘图加鼠标事件,实现客户端绘图. 2.每记录鼠标有效绘图10个点,就把这10个点通过socket传递给服务器. ...
- gin+MySQL简单实现数据库查询
利用 gin 项目搭建一个简易的后端系统. 一个简易的 HTTP 响应接口 首先在 go 工作区的终端输入这条指令: go get -u github.com/gin-gonic/gin 将 gin ...
- Yii 实现数据库SUM操作
方法一:这种方法有个坑儿,就是as 后面的别名,必须是属性范围内的名字. $criteria = new CDbCriteria(); $criteria->select = 'sum(amou ...
- TIM_Cmd()函数引发的思考
在使用定时器的输入捕获进行频率测量时发现用TIM_Cmd()函数关闭定时器后,输入捕获中断还是会被触发,这就很奇怪了,输入捕获是定时器的一种模式,关闭定时器不就意味着输入捕获捕获也被关闭了吗?可是实际 ...
- 很多人讲不明白HTTPS,但是我能
很多人讲不明白HTTPS,但是我能 今天我们用问答的形式,来彻底弄明白HTTPS的过程 下面的问题都是 小明和小丽两个人通信为例 可以把小明想象成服务端,小丽想象成客户端 1. https是做什么用的 ...
- 如何保留 Excel 表头和第一行数据并追加 CSV 数据
准备工作 在开始之前,确保你的 Python 环境中已经安装了 openpyxl 和 pandas 库.可以使用以下命令进行安装: pip install openpyxl pandas 第一步:编写 ...
- c# .net mvc 使用百度Ueditor富文本框上传文件(图片,视频等)
使用背景: 项目中需要用的富文本框去上传视频,图片的话大部分都是可以的.相对来说,国外的富文本框很成熟.但鉴于文档是英语,这里使用了百度的富文本框. 采用的api的方式,调用接口进行上传文件.话不多说 ...