深入理解 TypeScript
请支持本书:购买捐赠
(广告,请勿屏蔽。)

11 顶级类型 anyunknown



在 TypeScript 中,anyunknown 是包含所有值的类型。在本章中,我们将研究它们是什么以及它们的用途。

11.1 TypeScript 的两种顶级类型

anyunknown 在 TypeScript 中被称为*顶级类型*。引用 维基百科

*顶级类型* […] 是*通用*类型,有时也称为*通用超类型*,因为任何给定类型系统中的所有其他类型都是其子类型 […]。在大多数情况下,它是包含目标类型系统中所有可能[值]的类型。

也就是说,当将类型视为值的集合时(有关类型的更多信息,请参阅 [未包含的内容]),anyunknown 是包含所有值的集合。另外,TypeScript 还有*底层类型* never,它是空集。

11.2 顶级类型 any

如果一个值具有 any 类型,我们可以对其执行任何操作

function func(value: any) {
  // Only allowed for numbers, but they are a subtype of `any`
  5 * value;

  // Normally the type signature of `value` must contain .propName
  value.propName;

  // Normally only allowed for Arrays and types with index signatures
  value[123];
}

每个类型都可以赋值给 any 类型

let storageLocation: any;

storageLocation = null;
storageLocation = true;
storageLocation = {};

any 类型可以赋值给每个类型

function func(value: any) {
  const a: null = value;
  const b: boolean = value;
  const c: object = value;
}

使用 any,我们将失去 TypeScript 静态类型系统通常提供给我们的任何保护。因此,它应该仅作为最后的手段使用,如果我们不能使用更具体的类型或 unknown

11.2.1 示例:JSON.parse()

JSON.parse() 的结果取决于动态输入,这就是为什么返回类型是 any(我从签名中省略了参数 reviver

JSON.parse(text: string): any;

JSON.parse()unknown 类型存在之前就被添加到 TypeScript 中。否则,它的返回类型可能是 unknown

11.2.2 示例:String()

函数 String() 将任意值转换为字符串,它具有以下类型签名

interface StringConstructor {
  (value?: any): string; // call signature
  // ···
}

11.3 顶级类型 unknown

unknown 类型是 any 类型的类型安全版本。每当您考虑使用 any 时,请先尝试使用 unknown

any 允许我们做任何事情,而 unknown 则要严格得多。

在我们可以对 unknown 类型的执行任何操作之前,我们必须首先通过以下方式缩小其类型范围