在TypeScript中,any和unknown是包含所有值的類型。在這裡,我們将研究它們是如何工作的。
TypeScript的兩個頂級類型TypeScript的兩個頂級類型any和unknown是TypeScript中所謂的頂級類型。引用維基百科:
The top type [...] is the universal type, sometimes called the universal supertype as all other types in any given type system are subtypes [...]. In most cases it is the type which contains every possible [value] in the type system of interest.
也就是說,當将類型視為值集時,any和unknown是包含所有值的集。另外,TypeScript還有底層的never類型,即空集合。
any如果某個值的類型為any,我們可以對其執行所有操作:
function func(value: any) {
5 * value;
value.propName;
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時,才能将any作為最後手段使用。
例如:JSON.parse()JSON.parse()取決于動态輸入,這就是返回類型為any的原因:
JSON.parse(text: string): any;
JSON.parse()是在unknown類型之前添加到TypeScript語言中的。如果不是,那麼它的返回類型可能就會被定義為unknown。
unknownunknown類型是any類型的安全版本。每當你想用any時,試着先用unknown。
在任何允許我們做任何事情的地方,unknown的限制要大得多。
在對unknown類型的值執行任何操作之前,必須首先通過以下方式縮小其類型:
function func(value: unknown) {
// Type assertion:
(value as number).toFixed(2);
}
function func(value: unknown) {
if (value === 123) { // equality
value;
value * 5;
}
}
function func(value: unknown) {
if (typeof value === 'string') { // type guard
value;
value.length;
}
}
function func(value: unknown) {
assertionFunction(value);
value;
value.test('abc');
}
function assertionFunction(arg: unknown): asserts arg is RegExp {
if (! (arg instanceof RegExp)) {
throw new TypeError('Not a RegExp: ' arg);
}
}
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!