any 和 unknown 都是顶级类型 top type,也就是所有类型的父类型
一、any
any代表任意类型, 是不做任何检查,相当于不使用 ts,不建议使用,使用 a as any as string 之类的,可以让类型检查通过,但是不建议使用。
let anys: any = 123;
anys = '123';
anys = true;
声明变量的时候没有指定任意类型默认为any
let anys;
anys = '123';
anys = true;
弊端如果使用any 就失去了TS类型检测的作用
二、unknown
unknown 代表未知类型,更加严格,在对 unknown 类型的值执行大多数操作之前,必须进行某种形式的检查。 unknown 因为未知性质,不支持属性访问,不允许赋值给其他明确类型的变量。【任何类型的数据都可以赋值给unknown,但是unknown不可以赋值给其他明确类型的变量,如string等,不支持属性访问】
- 区别1:任何类型的数据都可以赋值给unknown,但是unknown不可以赋值给其他明确类型的变量,any可以
//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:unknow不支持属性访问,any可以
// 如果是any类型在对象没有这个属性的时候还在获取是不会报错的;
let obj: any = { b: 1 };
obj.a;
// 如果是unknow 是不能调用属性和方法
let obj: unknown = { b: 1, ccc: (): number => 213 };
obj.b;
obj.ccc();