项目中实现 TypeScript 时,我们可能经常觉得使用 any 类型非常方便。any 和 unknown 都是顶级类型,但是 unknown 更加严格,不像 any 那样不做类型检查,反而 unknown 因为未知性质,不允许访问属性,不允许赋值给其他有明确类型的变量。
any 和 unknown 的区别
any
不强制进行类型检查,可以存储任何类型的值也可以赋值给任何类型的变量
unknown
可以存储任何类型的值但不能赋值给其他任何类型的变量,除非赋值给自身或者进行了数据断言或者数据推断使之类型更加明确。
any 使用场景
任何你想偷懒的场景,如果这样还不如用 js
unknown 使用场景
使用 未知的 或者 不稳定的 数据来源的数据结构,可以使用 unknown
来代替。
将 unknown 类型缩小为一个更具体的类型
不同于 any 类型。如果不缩小类型,就无法对 unknown 类型执行任何操作
使用 typeof 判断类型
function unknownToString(value: unknown): string {
if (typeof value === "string") {
return value;
}
return String(value);
}
使用 instanceof 判断类型
type getAnimal = () => unknown;
const dog = getAnimal();
if (dog instanceof Dog) {
console.log(dog.name.toLowerCase());
}
对 unknown 类型使用类型断言
const value: unknown = "Hello World";
const foo: string = value; // Error
const bar: string = value as string; // OK