javascript java typeof unknown_了解TypeScript中的两种顶级类型:any和unknown

ab2d19c5bbdb709f1b819156d9f8d2c8.png

在 TypeScript中,any 和 unknown 是包含所有值的类型。在本文中,我们将会研究它们是怎样工作的。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

TypeScript 的两种顶级类型

any and unknown are so-called top types in TypeScript. Quoting Wikipedia:

any 和 unknown 在 TypeScript 中是所谓的“顶部类型”。以下文字引用自 Wikipedia:top type [...]是 通用(universal) 类型,有时也称为 通用超类型,因为在任何给定类型系统中,所有其他类型都是子类型[...]。通常,类型是包含了其相关类型系统中所有可能的[值]的类型。

也就是说,当把类型看作是值的集合时,any 和 unknown 是包含所有值的集合。顺便说一句,TypeScript 还有 bottom type never,它是空集。

顶级类型any

如果一个值的类型为 any,那么我们就可以用它任何事:function func(value: any) {

// 仅允许数字,但它们是 `any` 的子类型

5 * value;

// 通常,`value` 的类型签名必须包含 .propName

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,则只能将其用作最后的手段。

示例:JSON.parse()

JSON.parse() 的结果取决于动态输入,这就是其返回类型为 any 的原因(我从函数签名中省略了参数 reviver):JSON.parse(text: string): any;

在 unknown 类型出现之前,JSON.parse() 就已经被添加到了 TypeScript中。否则它的返回类型可能会是 unknown。

示例:String()

把任意值转换为字符串的函数 String() 具有以下类型签名:interface StringConstructor {

(value?: any): string; // call signature

// ···

}

顶级类型 unknown

unknown 类型是 any 的类型安全版本。每当你想使用 any 时,应该先试着用 unknown。

在 any 允许我们做任何事的地方,unknown 的限制则大得多。

在对 unknown 类型的值执行任何操作之前,必须先通过以下方法限定其类型:类型断言function func(value: unknown) {

// @ts-ignore: Object is of type 'unknown'.

value.toFixed(2);

// Type assertion:

(value as number).toFixed(2); // OK

}相等:function func(value: unknown) {

// @ts-ignore: Object is of type 'unknown'.

value * 5;

if (value === 123) { // equality

// %inferred-type: 123

value;

value * 5; // OK

}

}类型防护:function func(value: unknown) {

// @ts-ignore: 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-ignore: Object is of type 'unknown'.

value.test('abc');

assertionFunction(value);

// %inferred-type: RegExp

value;

value.test('abc'); // OK

}

function assertionFunction(arg: unknown): asserts arg is RegExp {

if (! (arg instanceof RegExp)) {

throw new TypeError('Not a RegExp: ' + arg);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值