任意类型
Any 类型 和 unknown 顶级类型
1.没有强制限定哪种类型,随时切换类型都可以 我们可以对 any 进行任何操作,不需要检查类型
typescript
let anys: any = 123;
anys = '123';
anys = true;
2.声明变量的时候没有指定任意类型默认为 any
typescript
let anys;
anys = '123';
anys = true;
3.弊端如果使用 any 就失去了 TS 类型检测的作用
4.TypeScript 3.0 中引入的 unknown 类型也被认为是 top type ,但它更安全。与 any 一样,所有类型都可以分配给 unknown
unknown 类型比 any 更加严格当你要使用 any 的时候可以尝试使用 unknown
区别 1
typescript
//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; //错误:不能将类型“unknown”分配给类型“string”
//这样就没问题 any类型是可以的
let names: any = '123';
let names2: string = names;
//unknown可赋值对象只有unknown 和 any
let b: unknown = '123';
let a: any = '456';
a = b;
区别 2
typescript
//如果是any类型在对象没有这个属性的时候还在获取是不会报错的
let obj: any = { b: 1 };
obj.a; //不报错
//如果是unknow 是不能直接调用属性和方法
let obj: unknown = { b: 1, ccc: (): number => 213 };
// 直接访问属性或调用方法会报错
obj.b; // 错误: 对象类型为 "unknown"
obj.ccc(); // 错误: 对象类型为 "unknown"
// 使用类型断言或类型检查后可以安全操作
if (
typeof obj === 'object' &&
obj !== null &&
'b' in obj &&
'ccc' in obj &&
typeof obj.ccc === 'function'
) {
console.log(obj.b); // 安全:已确认 obj 是对象并且有属性 'b'
console.log(obj.ccc()); // 安全:已确认 obj 有一个名为 'ccc' 的函数属性
}