空值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. Python:用tqdm模块绘制进度条

    在计算密集型迭代计算中,我们常常需要知道当前的迭代轮次,最传统的方法就是打印当前迭代计数器的轮数.那有没有更好的方法呢?我们可以使用tqdm模块(非py内置,需要单独按照)来在控制台绘制进度条,这样更 ...

  2. go高并发之路——go语言如何解决并发问题

    一.选择GO的原因 作为一个后端开发,日常工作中接触最多的两门语言就是PHP和GO了.无可否认,PHP确实是最好的语言(手动狗头哈哈),写起来真的很舒爽,没有任何心智负担,字符串和整型压根就不用区分, ...

  3. 常回家看看之off_by_one

    off_by_one这个漏洞比较特殊,它不像上一期的堆溢出,可以溢出很多字节,它只能溢出一个字节,在栈里面也可以通过这个漏洞修改返回地址什么的,在堆里面我们主要利用它来修改堆块的大小,形成fake_c ...

  4. Windows 7 任务栏开发 之 进度条(Progress Bar)

    上一篇我们完成了"覆盖图标"(Overlay Icon)的相关开发,本篇我们将对进度条特性进行研究.在使用IE 下载文件时,任务栏图标会同步显示当前下载进度(如下图).那么在应用程 ...

  5. ASP.NET Core - 实现自定义WebApi模型验证 ModelState

    Framework时代 在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 [HttpPost] public async Task<JsonResult> Sav ...

  6. 莫烦tensorflow学习记录 (3)建造我们第一个神经网络

    另一个学习文档http://doc.codingdict.com/tensorflow/tfdoc/tutorials/overview.html 定义 add_layer() https://mof ...

  7. js 判断手机号格式

    大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...

  8. sql server 怎么在原有表上加自增长主键列,并指定主键名

    sql server 怎么在原有表上加自增长主键列,并指定主键名: ALTER TABLE [Merchant_black] ADD  Id bigint identity(1,1)   constr ...

  9. TiDB 多集群告警监控-初章-监控融合、自动告警处理

    author:longzhuquan 背景 随着公司XC改造步伐的前进,越来越多的业务选择 TiDB,由于各个业务之间需要物理隔离,避免不了的 TiDB 集群数量越来越多.虽然每套 TiDB 集群均有 ...

  10. Java连接mySql——简单JDBC连接数据库

    利用JDBC开发数据库 经典应该用框架:      第一步,加载JDBC数据库驱动程序(不同的数据库有不同的数据库驱动,所以在连接数据库之前,需加载驱动)     格式:     String dri ...