前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TypeScript 中的顶级类型:any 和 unknown

TypeScript 中的顶级类型:any 和 unknown

作者头像
疯狂的技术宅
发布2020-06-11 15:20:53
2.4K0
发布2020-06-11 15:20:53
举报
文章被收录于专栏:京程一灯京程一灯

翻译:疯狂的技术宅

作者:Dr. Axel Rauschmayer

正文共:2525 字

预计阅读时间:10 分钟

在 TypeScript中,anyunknown 是包含所有值的类型。在本文中,我们将会研究它们是怎样工作的。


TypeScript 的两种顶级类型

anyunknown 在 TypeScript 中是所谓的“顶部类型”。以下文字引用自 维基百科 (https://en.wikipedia.org/wiki/Top_type):

top type […]是 通用(universal) 类型,有时也称为 通用超类型,因为在任何给定类型系统中,所有其他类型都是子类型[…]。通常,类型是包含了其相关类型系统中所有可能的[值]的类型。

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

顶级类型 any

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

代码语言:javascript
复制
function func(value: any) {
    // 仅允许数字,但它们是 `any` 的子类型
    5 * value;

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

    // 通常只允许带有索引签名的数组和类型
    value[123];
}

任何类型的值都可以赋值给 any 类型:

代码语言:javascript
复制
let storageLocation: any;

storageLocation = null;
storageLocation = true;
storageLocation = {};

类型 any 也可被可赋值给每一种类型:

代码语言:javascript
复制
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):

代码语言:javascript
复制
JSON.parse(text: string): any;

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

示例:String( )

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

代码语言:javascript
复制
interface StringConstructor {
    (value?: any): string; // call signature
    // ···
}

顶级类型 unknown

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

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

在对 unknown 类型的值执行任何操作之前,必须先通过以下方法限定其类型:

  • 类型断言
代码语言:javascript
复制
function func(value: unknown) {
    // @ts-ignore: Object is of type 'unknown'.
    value.toFixed(2);

    // Type assertion:
    (value as number).toFixed(2); // OK
}
  • 相等:
代码语言:javascript
复制
function func(value: unknown) {
    // @ts-ignore: Object is of type 'unknown'.
    value * 5;

    if (value === 123) { // equality
        // %inferred-type: 123
        value;

        value * 5; // OK
    }
}
  • 类型防护:
代码语言:javascript
复制
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
    }
}
  • 断言函数:
代码语言:javascript
复制
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);
    }
}

原文链接

https://2ality.com/2020/06/any-unknown-typescript.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端先锋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • TypeScript 的两种顶级类型
  • 顶级类型 any
    • 示例:JSON.parse( )
      • 示例:String( )
      • 顶级类型 unknown
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档