any
及 unknown
any
JSON.parse()
String()
unknown
在 TypeScript 中,any
和 unknown
是包含所有值的型別。在本章中,我們將探討它們是什麼以及它們可以如何使用。
any
和 unknown
在 TypeScript 中被稱為頂層型別。引用 維基百科
頂層型別 […] 是萬用型別,有時稱為萬用父型別,因為在任何給定的型別系統中所有其他型別都是子型別 […]. 在大多數情況下,它是包含型別系統中所有可能 [值] 的型別。
也就是說,當將型別視為值的集合時(有關型別是什麼的更多資訊,請參閱 [未包含內容]),any
和 unknown
是包含所有值的集合。順帶一提,TypeScript 也有底層型別 never
,它是空集合。
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
.propName;
value
// Normally only allowed for Arrays and types with index signatures
123];
value[ }
每個型別都可以指定給型別 any
: any;
let storageLocation
= null;
storageLocation = true;
storageLocation = {}; storageLocation
型別 any
可以指定給每個型別
function func(value: any) {
: null = value;
const a: boolean = value;
const b: object = value;
const c }
使用 any
,我們會失去 TypeScript 的靜態型別系統通常給予我們的任何保護。因此,只有在我們無法使用更具體的型別或 unknown
時,才應將其作為最後的手段使用。
JSON.parse()
JSON.parse()
的結果取決於動態輸入,這就是為什麼回傳型別是 any
的原因(我已從簽章中省略參數 reviver
)
JSON.parse(text: string): any;
JSON.parse()
是在 TypeScript 中新增的,當時還沒有 unknown
類型。否則,它的回傳類型可能會是 unknown
。
String()
將任意值轉換為字串的函式 String()
,具有下列類型簽章
interface StringConstructor {?: any): string; // call signature
(value// ···
}
unknown
unknown
類型是 any
類型的類型安全版本。每當你考慮使用 any
時,請先嘗試使用 unknown
。
any
允許我們執行任何操作,而 unknown
的限制則更多。
在我們對 unknown
類型的值執行任何操作之前,我們必須先透過下列方式縮小其類型
類型斷言:
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
.toFixed(2);
value
// Type assertion:
as number).toFixed(2); // OK
(value }
相等性
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
* 5;
value
if (value === 123) { // equality
// %inferred-type: 123
;
value
* 5; // OK
value
} }
類型防護:
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
.length;
value
if (typeof value === 'string') { // type guard
// %inferred-type: string
;
value
.length; // OK
value
} }
斷言函式:
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
.test('abc');
value
assertIsRegExp(value);
// %inferred-type: RegExp
;
value
.test('abc'); // OK
value
}
/** An assertion function */
function assertIsRegExp(arg: unknown): asserts arg is RegExp {
if (! (arg instanceof RegExp)) {
new TypeError('Not a RegExp: ' + arg);
throw
} }