一起来学TypeScript:any和unknown有啥区别?

84 阅读2分钟

在TypeScript中,unknownany 都是用来表示任意类型的类型,但它们在类型安全性和使用方式上有着重要的区别

  1. 类型安全性

    • any 类型是 TypeScript 中最不安全的类型。当你使用 any 类型时,你可以对变量执行任何操作,包括访问任何属性和方法,调用任何函数,而 TypeScript 编译器不会提供任何类型检查或错误提示。
    • unknown 类型是 TypeScript 中一种更安全的类型,它代表任何值,但要求在使用之前进行类型检查。这意味着你不能直接对 unknown 类型的值执行操作,除非先通过类型守卫或类型断言来确保它的类型。
  2. 类型检查

    • any 类型的变量可以被赋予任何值,且可以执行任何操作,TypeScript 编译器不会对其进行任何类型检查。
    • unknown 类型的变量在使用前需要进行类型检查。例如,你可以使用 if 语句来检查它是否是 stringnumber 等,或者使用类型守卫函数来确保它是预期的类型。
  3. 赋值和操作

    • any 类型的变量可以赋值给任何其他类型的变量,反之亦然,不需要任何类型转换或断言。
    • unknown 类型的变量不能直接赋值给 unknown 之外的类型,除非进行了类型断言或类型守卫。
  4. 类型兼容性

    • any 是所有类型的超集,它可以与任何类型兼容。
    • unknown 是所有类型的子集,只有当其他类型是 any 或者使用了类型守卫时,unknown 才能赋值给它们。
  5. 最佳实践

    • any 类型应该谨慎使用,因为它会跳过 TypeScript 的类型检查,从而失去类型系统的优势。
    • unknown 类型是推荐使用的,因为它鼓励进行类型检查,有助于避免运行时错误。
  6. 类型守卫

    • 使用 any 类型时,你不需要(也不能)使用类型守卫。
    • 使用 unknown 类型时,类型守卫是必需的,以确保变量在使用前是安全的。

也就是说,unknown 提供了一种更安全的方式来处理不确定的类型,而 any 则提供了最大的灵活性,但牺牲了类型安全性。

在 TS 中,推荐尽可能使用 unknown 和类型守卫,以充分利用 TypeScript 的类型系统。