any 和 unknownanyJSON.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
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。
JSON.parse()JSON.parse() 的结果取决于动态输入,这就是为什么返回类型是 any(我从签名中省略了参数 reviver)
JSON.parse(text: string): any;JSON.parse() 在 unknown 类型存在之前就被添加到 TypeScript 中。否则,它的返回类型可能是 unknown。
String()函数 String() 将任意值转换为字符串,它具有以下类型签名
interface StringConstructor {
(value?: any): string; // call signature
// ···
}unknownunknown 类型是 any 类型的类型安全版本。每当您考虑使用 any 时,请先尝试使用 unknown。
any 允许我们做任何事情,而 unknown 则要严格得多。
在我们可以对 unknown 类型的执行任何操作之前,我们必须首先通过以下方式缩小其类型范围
类型断言:
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
value.toFixed(2);
// Type assertion:
(value as number).toFixed(2); // OK
}相等性
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
value * 5;
if (value === 123) { // equality
// %inferred-type: 123
value;
value * 5; // OK
}
}类型守卫:
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
value.length;
if (typeof value === 'string') { // type guard
// %inferred-type: string
value;
value.length; // OK
}
}断言函数:
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
value.test('abc');
assertIsRegExp(value);
// %inferred-type: RegExp
value;
value.test('abc'); // OK
}
/** An assertion function */
function assertIsRegExp(arg: unknown): asserts arg is RegExp {
if (! (arg instanceof RegExp)) {
throw new TypeError('Not a RegExp: ' + arg);
}
}