any类型

表示任意的类型,没有强制限定是什么的类型

可以对any进行任何操作,而不被检查类型

1
2
3
let anys:any = 123
anys = '123'
anys = true

声明时没有指定类型的变量默认为any

1
2
3
let anys;
anys = '123'
anys = true

如果使用any,就失去了TS类型检测的作用,也没有代码提示,和JS没什么两样了AnyScript

unknown类型

表示不知道的类型,TS3.0引入

与any一样,所有类型都可以被分配给unknown

1
2
3
4
5
6
7
8
9
10
11
// 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

any和unknown的区别

unknown类型比any类型更加严格,但也更加安全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 这样写会报错
// unknow类型不能作为子类型只能作为父类型
let names:unknown = '123'
// unknown类型不能赋值给其他类型
let names2:string = names

// 这样写没问题
// any可以作为父类型和子类型
let names:any = '123'
// any类型可以赋值给其他类型
let names2:string = names

// unknown变量只能赋值给unknown或any变量
let bbb:unknown = '123'
let aaa:any= '456'
aaa = bbb

在赋引用类型时也有区别

1
2
3
4
5
6
7
8
// 如果是any类型,调用属性和方法不会报错,即使没有这个属性或方法
let obj1:any = {b:1}
obj1.a

// 如果是unknow,调用属性和方法会报错,即使有这个属性或方法
let obj2:unknown = {b:1,ccc:():number=>213}
obj2.b
obj2.ccc()

类型级别

  • any和unknown都是顶级类型(top type)
  • 第二级是Object
  • 第三级是Number、String、Boolean这些包装器对象
  • 第四级是number、string、boolean这些基本类型
  • 第五级是具体的值,例如1、”yajue”、false
  • 第六级是never类型

上级类型对下级而言是包含的关系