《TypeScript学习--基本类型和任意类型》

TS 是 JS 的超集,所以 JS 基础的类型都包含在内

起步

安装 typescript

1
npm install typescript -g

基础类型

基础类型:Boolean、Number、String、null、undefined 以及 ES6 的 Symbol 和 ES10 的 BigInt。

字符串类型

1
2
let n: number = "123";
let s: string = `nagisa${n}`;

数字类型

1
2
3
4
5
6
7
let notANumber: number = NaN; //Nan
let num: number = 123; //普通数字
let infinityNumber: number = Infinity; //无穷大
let decimal: number = 6; //十进制
let hex: number = 0xf00d; //十六进制
let binary: number = 0b1010; //二进制
let octal: number = 0o744; //八进制s

布尔类型

1
2
let createdBoolean: boolean = new Boolean(1);
//这样会报错 应为事实上 new Boolean() 返回的是一个 Boolean 对象

事实上 new Boolean() 返回的是一个 Boolean 对象 需要改成

1
let createdBoolean: Boolean = new Boolean(1);
1
2
let booleand: boolean = true; //可以直接使用布尔值
let booleand2: boolean = Boolean(1); //也可以通过函数返回布尔值

空值类型

JavaScript 没有空值(Void)的概念,在 TypeScript 中,可以用 void 表示没有任何返回值的函数

1
2
3
function voidFn(): void {
console.log("test void");
}

void 类型的用法,主要是用在我们不希望调用者关心函数返回值的情况下,比如通常的异步回调函数

void 也可以定义 undefinednull 类型

1
2
let u: void = undefined;
let n: void = null;

void 和 undefined 和 null 最大的区别

void 的区别是,undefined null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 string类型的变量:

1
2
3
4
//这样写会报错 void类型不可以分给其他类型
let test: void = undefined;
let num2: string = "1";
num2 = test;
1
2
3
4
5
6
7
8
9
10
11
//这样是没问题的
let test: null = null;
let num2: string = "1";

num2 = test;

//或者这样的
let test: undefined = undefined;
let num2: string = "1";

num2 = test;

TIPS 注意:
如果你配置了 tsconfig.json 开启了严格模式,null不能 赋予void类型

1
2
3
4
5
{
"compilerOptions":{
"strict": true
}
}

任意类型

Any 类型 和 unknown 顶级类型

  1. 没有强制限定哪种类型,随时切换类型都可以 我们可以对 any 进行任何操作,不需要检查类型
1
2
3
let anys: any = 123;
anys = "123";
anys = true;
  1. 声明变量的时候没有指定任意类型默认为 any
1
2
3
let anys;
anys = "123";
anys = true;
  1. 弊端如果使用 any 就失去了 TS 类型检测的作用

  2. TypeScript 3.0 中引入的 unknown 类型也被认为是 top type ,但它更安全。与 any 一样,所有类型都可以分配给 unknown

unknow unknow 类型比 any 更加严格当你要使用 any 的时候可以尝试使用 unknow

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
//unknown 可以定义任何类型的值
let value: unknown;

value = true; // OK
value = 42; // OK
value = "Hello World"; // OK
value = []; // OK
value = {}; // OK
value = null; // OK
value = undefined; // OK
value = Symbol("type"); // OK

//这样写会报错unknow类型不能作为子类型只能作为父类型 any可以作为父类型和子类型
//unknown类型不能赋值给其他类型
let names: unknown = "123";
let names2: string = names;

//这样就没问题 any类型是可以的
let names: any = "123";
let names2: string = names;

//unknown可赋值对象只有unknown 和 any
let bbb: unknown = "123";
let aaa: any = "456";

aaa = bbb;

区别 2

1
2
3
4
5
6
7
如果是any类型在对象没有这个属性的时候还在获取是不会报错的
let obj:any = {b:1}
obj.a
如果是unknow 是不能调用属性和方法
let obj:unknown = {b:1,ccc:():number=>213}
obj.b
obj.ccc()