Any 和 unknown 类型
// --------- any -------------
// 我们知道,let a = 123 ; 的时候,会自动将 a 变成 number 类型的变量
// 但是当一个变量只是声明,但是没有赋值 ,将会自动转换成 ===》 any类型的变量
let a;
// 当 a 不需要给其他变量赋值当时候,等效于 let a: any;
a = 123;
a = "lmj"
a = true
console.log("这是a: ", a)
// a 的类型不确定,ts会自动将其定义为隐式 any ,能够变成多种类型
// 定义的any类型,是可以给仍以类型赋值, 也可以被任意类型赋值
let a2: any;
a2 = 123;
a2 = "xyy";
a2 = false;
a2 = a;
console.log("这是a2: ", a2)
let b: string = "lmj";
b = a2;
console.log("这是b: ", b)
// any 类型,不仅自己当类型可以多次改变,还能赋值给其他类型的变量
// --------- unkonwn ----------
let c: unknown;
c = 123;
c = "lmj";
c = true;
c = a2;
console.log("这是c: ", c)
a2 = c;
console.log("这是a2: ", a2)
let c2: unknown;
c2 = "xyy";
c2 = c;
console.log("这是c2: ", c2)
c2 = b;
console.log("这是c2: ", c2)
// unknown 是无法给 unknown之外 的其他变类型变量赋值的
// unknown 也是可以被任意赋值的, 类似 a 这种隐式的 any 都是可以给他赋值的
// 总结:
// 隐式any 和 声明的any 以及 unknown 都是可以自己给自己赋值的并且是多种类型的
// 隐式any 不能给这三类之外的内容赋值。自己能被任意类型的变量赋值
// 显式any 能给任意类型的变量赋值,也能被任意类型的变量赋值
// unknown 不能给 any 和 自己类型之外的变量赋值,能被任意变量赋值
// 如果希望 unknown 能赋值给其他基本类型,只需要判断一下就好了
let d1: unknown;
d1 = 123;
d1 = "lmj";
let d2: string;
d2 = "xyy";
d2 = "gy";
if (typeof d1 === "string") {
d2 = d1;
}
console.log("这是d2: ", d2)
// 判断其类型的方式还有一种,叫做 类型断言
d2 = d1 as string;
// 等效于 d2 = <string>d1
console.log("这是d2的类型: ", typeof d2)
console.log("这是d2的值: ", d2)
// 类型断言指的是,我断定他就是这个类型,那么依然可以赋值
// 类型断言 as 后面的类型必须是被赋值的类型,但是如果类型断言错了
// 则会直接改变 原变量 的类型, 强转
let e1: unknown;
e1 = 123;
let e2: string;
e2 = "lmj"
e2 = <string>e1;
console.log("这是e2的类型: ", typeof e2);
console.log("这是e2的值: ", e2)