空值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

  1. 任意值(Any)用来表示允许赋值为任意类型。一个普通类型,在赋值过程中是不被允许改变类型的,any 类型,允许被赋值为任意类型。
let str: string = 'abc';
str = 123; // Type 'number' is not assignable to type 'string'. // ----------------------------------------------------------------- let str: any = 'abc';
str = 123; // 编译通过
  1. 任意值可以访问任意属性和方法:
let anyThing: any = 'hello';

anyThing.setName('Jerry');
anyThing.setName('Jerry').sayHello();
anyThing.myName.setFirstName('Cat'); console.log(anyThing.myName);
console.log(anyThing.myName.firstName); // 编译通过
  1. 未声明类型的变量:如果变量在声明时,未指定类型,那么会被识别为任意值类型:
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(三)的更多相关文章

  1. TypeScript 学习笔记 — 类型兼容 (十)

    目录 一.基本数据类型的兼容性 二.接口兼容性 三.函数的兼容性 四.类的兼容性 类的私有成员和受保护成员 五.泛型的兼容性 六.枚举的兼容性 标称类型简短介绍 TS 是结构类型系统(structur ...

  2. Typescript 学习笔记二:数据类型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  3. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  4. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  5. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  7. Typescript 学习笔记一:介绍、安装、编译

    前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...

  8. TypeScript学习笔记(八):1.5版本之后的模块和命名空间

    我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块 但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以 ...

  9. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  10. typescript学习笔记(一)---基础变量类型

    作为一个前端开发者,学习新技术跟紧大趋势是必不可少的.随着2019年TS的大火,我打算利用一个月的时间学习这门语言.接下来的几篇文章是我学习TS的学习笔记,其中也会掺杂一些学习心得.话不多说,先从基础 ...

随机推荐

  1. k8s错误集合

    1.etcd没有启动的 [root@mcwk8s03 ~]# kubectl get nodesUnable to connect to the server: context deadline ex ...

  2. Javascript/DOM:如何删除 DOM 对象的所有事件侦听器

    Javascript/DOM:如何删除 DOM 对象的所有事件侦听器 一.重写 重写 EventTarget 添加监听事件方法 addEventListener if (EventTarget.pro ...

  3. dubbo 的三种引用

    第一种:SpringBoot 整合 Dubbo 进行分布式开发https://www.cnblogs.com/gdufs/p/9414331.html?share_token=8cc709f1-99d ...

  4. Python Pandas 数据分组

    在数据处理中,分箱.分组是一种常见的技术,用于将连续数据的间隔分组到"箱"或"桶"中.我们将讨论以下两种方法: 使用 Pandas 的 between 和 lo ...

  5. LlamaFS自组织文件管理器

    LlamaFS是一个自组织文件管理器.它可以基于文件内容和修改时间等属性自动重命名和组织您的文件.它能让你不把时间花在对文件的复制.粘贴.重命名.拷贝.排序等简单操作上.有幸在Github上看到Lla ...

  6. 7.12考试总结(NOIP模拟12)[简单的区间·简单的玄学·简单的填数]

    即使想放弃,也没法放弃最想要的东西,这就是人 前言 这次应该是和 SDFZ 一起打的第一场比赛吧. 然而我还是 FW 一个... 这次考试也有不少遗憾,主要的问题是码力不足,不敢去直面正解,思考程度不 ...

  7. k8s网络问题以及容器跨宿主机通信原理

    [0]资源配置文件 [root@mcwk8s03 mcwtest]# ls mcwdeploy.yaml [root@mcwk8s03 mcwtest]# cat mcwdeploy.yaml api ...

  8. CSP-S2019 题解

    做了这套题,如果是让现在的我当时去考的话应该一共可以有 450 分,格雷码,括号树,树的重心都可以做,树上的数可以有 10 分,Emiya 至少可以有 76 分, 划分也可以有 64 分.看 OIer ...

  9. Windows Server 2016 离线安装.NET Framework 3.5

    Windows Server 2016 离线安装.NET Framework 3.5 1.双击Windows Server 2016的ISO,会自动挂载,比如F盘. 2.右键开始菜单- 命令提示符(管 ...

  10. 高性能版本的零内存分配LikeString函数(ZeroMemAllocLikeOperator)

    继上一篇文章在.NET Core,除了VB的LikeString,还有其它方法吗?(四种LikeString实现分享)分享了四种实现方式,笔者对这四种实现方式,不管是执行性能还是内存分配性能上,都不太 ...