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()
在 unknown
类型存在之前就被添加到 TypeScript 中。否则,它的返回类型可能是 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
} }