認識 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() 是在 TypeScript 中新增的,當時還沒有 unknown 類型。否則,它的回傳類型可能會是 unknown

11.2.2 範例:String()

將任意值轉換為字串的函式 String(),具有下列類型簽章

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

11.3 頂層類型 unknown

unknown 類型是 any 類型的類型安全版本。每當你考慮使用 any 時,請先嘗試使用 unknown

any 允許我們執行任何操作,而 unknown 的限制則更多。

在我們對 unknown 類型的值執行任何操作之前,我們必須先透過下列方式縮小其類型