# 二.基础类型
前言
常见的基础类型总结
# 1.布尔类型
- 编译前
let isClose: boolean = true
1
- 编译后
"use strict";
let isClose = true;
1
2
2
# 2.数值类型
数值包括 number
类型和 bigInt
类型,它们是不兼容的
# 2.1 Number
编译前
let count: number = 10
编译后
"use strict"; let count = 10;
1
2
# 2.2 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))
1
2
3
4编译后
"use strict"; const num1 = Number.MAX_SAFE_INTEGER + 1; const num2 = Number.MAX_SAFE_INTEGER + 2; console.log(num1 === num2); // true let max = BigInt(Number.MAX_SAFE_INTEGER); console.log(max + BigInt(1) === max + BigInt(2));
1
2
3
4
5
6
# 3.字符串类型
编译前
let str: string = "hello ts"
编译后
"use strict"; let str = "hello ts";
1
2
# 4.Null
编译前
let currentValue: null | boolean currentValue = null
1编译后
"use strict"; let currentValue; currentValue = null;
1
2
3
# 5.Undefined
编译前
let currentData: null | boolean currentData = true
1编译后
"use strict"; let currentData; currentData = true;
1
2
3
# 6.Symbol
编译前
const s1:symbol = Symbol("value1") const s2:symbol = Symbol("value2") console.log(s1 === s2)
1
2编译后
"use strict"; const s1 = Symbol("value1"); const s2 = Symbol("value2"); console.log(s1 === s2);
1
2
3
4
# 7.Any
编译前
// 1.定义 function cloneDeep(data: any) { return JSON.parse(JSON.stringify(data)) } // 2.使用 const cloneObj = cloneDeep({ key: 1, value: [{ id: 4 }] }) const cloneArr = cloneDeep([1, 2, 4, { key: [1, 2, 3] }])
1
2
3
4
5
6
7
8编译后
"use strict"; // 1.定义 function cloneDeep(data) { return JSON.parse(JSON.stringify(data)); } // 2.使用 const cloneObj = cloneDeep({ key: 1, value: [{ id: 4 }] }); const cloneArr = cloneDeep([1, 2, 4, { key: [1, 2, 3] }]);
1
2
3
4
5
6
7
8
# 8.Unknown
不能访问unknown
类型上的属性,不能作为函数、类来使用
编译前
// 1.使用案例 let value: unknown value = true // OK value = 42 // OK // 2.任何类型都可以赋值为`unknown`类型。它是`any`类型对应的安全类型 let unknown: unknown; unknown = "aaa"; unknown = 11; // 3.never 是`unknown`的子类型 type isNever = never extends unknown ? true : false; let currentVal: isNever = true; // 4.keyof unknown 是 never type key = keyof unknown; function getVal(): key { while (true) { } } // 5.unknown 类型不能被遍历 type IMap<T> = { [P in keyof T]: number; }; type t = IMap<unknown>; // 6.unknown 类型不能和 number 类型进行`+`运算,可以用于等或不等操作 // 7.联合类型中的`unknown`:联合类型与`unknown`都是`unknown`类型 type UnionUnknown = unknown | null | string | number; let knownVal: UnionUnknown = 'dddd' // 8.交叉类型中的`unknown`:交叉类型与`unknown`都是其他类型 type inter = unknown & null; let interVal: inter = null
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35编译后
"use strict"; // 1.使用案例 let value; value = true; // OK value = 42; // OK // 2.任何类型都可以赋值为`unknown`类型。它是`any`类型对应的安全类型 let unknown; unknown = "aaa"; unknown = 11; let currentVal = true; function getVal() { while (true) { } } let knownVal = 'dddd'; let interVal = null;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 9.Void
只能接受 null,undefined。一般用于函数的返回值
编译前
let consoleVal = (val: void): void => { console.log(val) } consoleVal(undefined) consoleVal()
1
2
3
4
5编译后
"use strict"; let consoleVal = (val) => { console.log(val); }; consoleVal(undefined); consoleVal();
1
2
3
4
5
6
# 10.Never
任何类型的子类型,never 代表不会出现的值。不能把其他类型赋值给 never
编译前
function error(message: string): never { throw new Error("err") } function loop(): never { while (true) {} } function fn(x: number | string) { if (typeof x === "number") { console.log('number') } else if (typeof x === "string") { console.log('string') } else { console.log(x) //never } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14编译后
"use strict"; function error(message) { throw new Error("err"); } function loop() { while (true) { } } function fn(x) { if (typeof x === "number") { console.log('number'); } else if (typeof x === "string") { console.log('string'); } else { console.log(x); //never } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 11.对象类型
type obj = {
[x: string]: any
}
1
2
3
2
3
type obj = Record<string, any>
1
interface Objs<T> {
[key: string]:T
}
const objs:Objs<number> = {
age: 18
}
1
2
3
4
5
6
7
2
3
4
5
6
7
编译前
let obj: { a: number; b: number } = { a: 1, b: 2 } let create = (obj:object):void =>{} create(obj) create({}) create([]) create(function(){})
1
2
3
4
5编译后
"use strict"; let obj = { a: 1, b: 2 }; let create = (obj) => { }; create(obj); create({}); create([]); create(function () { });
1
2
3
4
5
6
7
# 12.数组类型
# 12.1 元组类型(固定长度)
编译前
// 已知元素数量和类型的数组 let tuple: [string, number, boolean] = ["hello", 10, true] tuple.push("abc") // 在元组中增加数据,只能增加元组中存放的类型
1
2
3编译后
"use strict"; // 已知元素数量和类型的数组 let tuple = ["hello", 10, true]; tuple.push("abc"); // 在元组中增加数据,只能增加元组中存放的类型
1
2
3
4
# 12.2 不定长度
编译前
// 确定类型1 let arr1: number[] = [1, 2, 3] let arr2: string[] = ["1", "2", "3"] let arr3: (number | string)[] = [1, "2", 3] // 确定类型2 let arr: Array<number> = [1, 2, 3] let arr4: Array<number | string> = [1, "2", 3] // 泛型 type ArrType<T> = Array<T> let arr5: ArrType<number> = [1, 2, 3] let arr6: Array<number | string> = [1, "2", 3] interface treeNode { id: string; children: treeNode[] } const treeData: treeNode[] = []
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17编译后
"use strict"; // 确定类型1 let arr1 = [1, 2, 3]; let arr2 = ["1", "2", "3"]; let arr3 = [1, "2", 3]; // 确定类型2 let arr = [1, 2, 3]; let arr4 = [1, "2", 3]; let arr5 = [1, 2, 3]; let arr6 = [1, "2", 3]; const treeData = [];
1
2
3
4
5
6
7
8
9
10
11
# 13.枚举类型
编译前
// 数字枚举:除了⽀持 从成员名称到成员值 的普通映射之外,它还⽀持 从成员值到成员名称 的反向映射 enum USER_ROLE { USER, // 默认从0开始 ADMIN, MANAGER, } console.log(USER_ROLE[0]) console.log(USER_ROLE.USER) //异构枚举:异构枚举的成员值是数字和字符串的混合 enum USER_ROLE2 { USER = "user", ADMIN = 1, MANAGER, } console.log(USER_ROLE2.USER) // 常量枚举 const enum USER_ROLE3 { USER, ADMIN, MANAGER, } console.log(USER_ROLE3.USER)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23编译后
"use strict"; // 数字枚举:除了⽀持 从成员名称到成员值 的普通映射之外,它还⽀持 从成员值到成员名称 的反向映射 var USER_ROLE; (function (USER_ROLE) { USER_ROLE[USER_ROLE["USER"] = 0] = "USER"; USER_ROLE[USER_ROLE["ADMIN"] = 1] = "ADMIN"; USER_ROLE[USER_ROLE["MANAGER"] = 2] = "MANAGER"; })(USER_ROLE || (USER_ROLE = {})); console.log(USER_ROLE[0]); console.log(USER_ROLE.USER); //异构枚举:异构枚举的成员值是数字和字符串的混合 var USER_ROLE2; (function (USER_ROLE2) { USER_ROLE2["USER"] = "user"; USER_ROLE2[USER_ROLE2["ADMIN"] = 1] = "ADMIN"; USER_ROLE2[USER_ROLE2["MANAGER"] = 2] = "MANAGER"; })(USER_ROLE2 || (USER_ROLE2 = {})); console.log(USER_ROLE2.USER); console.log(0 /* USER_ROLE3.USER */);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19