在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);
}
}