疯狂的技术宅

以前出于工作目的,编写和翻译了大量的技术文章,以前端为主,删掉了过时的、毫无营养的内容,留下的都是精华。


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于本站

  • 回到主站

  • 搜索

TypeScript 中的顶级类型:any 和 unknown

时间: 2020-06-05 分类: 前端技术   字数: 917 字 阅读: 2分钟
标签: #TypeScript# #any# #unknown#
  • 本文译自:https://2ality.com/2020/06/any-unknown-typescript.html
  • 译者:疯狂的技术宅

在 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

}




* 相等:


```ts
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
}

}




* 断言函数:


```ts
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);
  }
}
标签: #TypeScript# #any# #unknown#

标题:TypeScript 中的顶级类型:any 和 unknown

链接:https://fe-tech.viewnode.com/post/202006/05/

作者:疯狂的技术宅

声明: 本博客文章除特别声明外,均采用 CC BY-NC-ND 4.0 国际许可协议( 知识共享署名-非商业性使用-禁止演绎 4.0),转载请注明出处!

Typescript 使用笔记
10 个超有用的 JavaScript 技巧
  • 文章目录
  • 站点概览
疯狂的技术宅

疯狂的技术宅

退休程序员,硬件发烧友,人工智能爱好者。写写代码喝喝茶,晒晒太阳带带娃。

457 日志
8 分类
583 标签
GitHub
友情链接
  • viewnode
  • mofish
标签云
  • Javascript 172
  • Node.Js 62
  • Vue 36
  • Typescript 28
  • 实战项目 28
  • 面试 21
  • React 20
  • Css 17
  • 面试题 16
  • 教程 13
  • Promise 12
  • Chrome 9
  • Debug 9
  • 调试 9
  • 资源 9
  • Deno 8
  • Dom 8
  • 杂谈 8
  • 正则表达式 8
  • 测试 8
  • TypeScript 的两种顶级类型
  • 顶级类型 any
    • 示例:JSON.parse()
    • 示例:String()
  • 顶级类型 unknown
© 2018 - 2022 疯狂的技术宅 All Rights Reserved
Powered by - Hugo v0.99.0 / Theme by - NexT
Storage by 俺的服务器 / 冀ICP备2022010157号
0%