TypeScript 中的“as const”是什么意思?它的用例是什么?

2024-03-17

我很困惑as const投掷。我查了一些文档和视频,但没有完全理解。

我关心的是as const下面代码中的意思是什么,使用它有什么好处?

const args = [8, 5] as const;
const angle = Math.atan2(...args);
console.log(angle);

This is known as a const assertion https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions. A const assertion tells the compiler to infer the narrowest* or most specific type it can for an expression. If you leave it off, the compiler will use its default type inference behavior, which will possibly result in a wider or more general type.

请注意,它称为“断言”而不是“强制转换”。在 TypeScript 中通常要避免使用“cast”这个术语;当人们说“cast”时,他们通常暗示某种可以在运行时观察到的效果,但是 TypeScript 的类型系统,包括类型断言和const断言,完全是erased https://www.typescriptlang.org/docs/handbook/2/basic-types.html#erased-types来自发出的 JavaScript。所以完全没有区别在运行时在使用的程序之间as const和一个没有。


但在编译时,存在明显的差异。让我们看看当你离开时会发生什么as const在上面的例子中:

const args = [8, 5];
// const args: number[]
const angle = Math.atan2(...args); // error! Expected 2 arguments, but got 0 or more.
console.log(angle);

编译器看到const args = [8, 5];并推断出类型number[]。这是一个由零个或多个类型元素组成的可变数组number。编译器不知道how many or which元素有。这样的推论大体上是合理的;通常,数组内容需要以某种方式进行修改。如果有人想写args.push(17) or args[0]++,他们会对某种类型感到满意number[].

不幸的是下一行,Math.atan2(...args),导致错误。这Math.atan2()函数恰好需要两个数字参数。但编译器都知道args是它是一个数字数组。它完全忘记了有两个元素,因此编译器抱怨您正在调用Math.atan2()当它只需要两个时,使用“0个或多个”参数。


将其与代码进行比较as const:

const args = [8, 5] as const;
// const args: readonly [8, 5]
const angle = Math.atan2(...args); // okay
console.log(angle);

现在编译器推断args属于类型readonly [8, 5]... a readonly tuple https://www.typescriptlang.org/docs/handbook/2/objects.html#readonly-tuple-types其值正是数字8 and 5以该顺序。具体来说,args.length已知正是2由编译器。

这对于下一行来说就足够了Math.atan2()上班。编译器知道Math.atan2(...args)是相同的Math.atan2(8, 5),这是一个有效的调用。


再说一遍:在运行时,没有任何区别。两个版本都记录1.0121970114513341到控制台。但const与静态类型系统的其余部分一样,断言并不意味着在运行时产生影响。相反,它们让编译器更多地了解intent的代码,并且可以更准确地辨别正确代码和错误之间的区别。


* This isn't strictly true for array and tuple types; a readonly array or tuple is technically wider than a mutable version. A mutable array is considered a subtype of a readonly array; the former is not known to have mutation methods like push() while the latter does.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript 中的“as const”是什么意思?它的用例是什么? 的相关文章

随机推荐

  • 链接 ipython 小部件按钮和滑块值

    我试图弄清楚如何将按钮小部件控制的计数器的值链接到滑块小部件的值 这里的目标是使用 ipython 小部件创建一个简单的 类似 vcr 的界面 其中包含三个小部件 IntSlider和两个Button递增计数器和递减计数器 这就是我所拥有的
  • 如何将标题图像居中

    我有个问题 其他人问题的答案并没有解决我的问题 这是关于我的标题中的图像 代码如下 HTML div div img class center src http i imgur com jfDhpP5 png div div li a hr
  • 如何使用Python抓取需要先登录的网站

    首先 我认为值得一提的是 我知道有很多类似的问题 但没有一个对我有用 我是 Python html 和网络爬虫的新手 我正在尝试从需要先登录的网站中抓取用户信息 在我的测试中 我使用从 github 抓取我的电子邮件设置作为示例 主页是 h
  • 一个文件夹中包含 100 万个或更多文件,用于包含(缓存)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个 理论 问题 看看我正在计划的解决方案是否有意义 我有一个脚本 可以从数据库中读取大量数据 包括设置 配置等 并将其构建在一起 针对每个注册用
  • 当我们给定中心点和半径大小时,如何绘制球体?

    我有一个像 1 2 2 23 2 3 3 6 3 4 5 的矩阵 每一行表示一个点 What I wish to do is like this I want to create a function which is given two
  • ExpandableListView 是否需要多个 viewHolder?

    我使用这个取景器是否错误 我在第 165 行收到 NPE 是否有明显的原因导致我失踪 如果我使用 ExpandableListView 是否需要组视图持有者和子视图持有者 我标记了第 165 行 以便让眼睛更舒服 多谢 我的可扩展列表视图正
  • Vuejs 3 webpack:vue-template-compiler 问题

    我正在尝试将 vuejs 3 集成到使用 webpack 的现有项目中 我读到了有关 vue loader 的内容 所以我正在尝试使用它 在官方文档中我有这样的内容 每次发布新版本的 vue 时 都会一起发布相应版本的 vue templa
  • Rails 其中 has_many 不为空

    My Campaign模型有很多Response 我想做的是这样的搜索Campaign where not responses nil 基本上返回所有有响应的活动的列表 最好的方法是什么 您可以通过查询来完成join Campaign jo
  • 有什么理由使用 isset() 吗?

    我为什么要使用if isset var 而不仅仅是if var 它似乎做了同样的事情 只是需要额外的处理 谢谢 Reason 原因是 isset 将返回布尔值 并且当您检查变量是否存在并继续时不会引发警告 此外 变量的值也有可能为零 fal
  • 为什么 C 会在 while 循环中卡住?

    当我编译并运行这段代码 它是一个更大的程序的一部分 时 Linux 已经完成了一半while循环 然后就停止工作 下面的代码打印time 0然后挂起 不执行任何其他操作 直到我暂停该进程 到底为什么它会打印time 0但不是下面的健全性检查
  • htaccess 中的重定向规则

    我的新闻有旧网址 例如http example com mynew 35 this is the title http example com mynew 35 this is the title 其中 35 是新闻的 ID 现在我的新网址
  • 列表理解和 len() 与简单的 for 循环

    我应该获取一个单词列表 并计算其中长度为 2 个或更多字符且第一个字符和最后一个字符相等的所有单词 我想出了两种可能的解决方案 result 0 for word in words if len word gt 2 and word 0 w
  • 是否可以将输入数组分散到参数中?

    因此 Promise all 将数组作为值传递到函数中 我更希望它将数组值作为参数传递 假设我有这个功能 function printData a b c console log a b c 我想 Promise all 1 2 3 the
  • GraphDB Free 8.8 Sparql INSERT 返回 400。不支持 INSERT?

    我正在使用 GraphDB Free 并尝试使用 sparql 将一些三元组插入到存储中 该查询看起来像一个简单的 INSERT Some Prefixes INSERT DATA subject predicate object 我使用
  • 无法访问文件“$libdir/plpgsql”:没有这样的文件或目录

    我不知所措 在本地 Postgres 服务器 postgres app Mac OS X 10 7 中创建存储过程时遇到问题 也是如此 psql psql 9 3 0 Type help for help dchaston CREATE O
  • MSSQL2008 - Pyodbc - 以前的 SQL 不是查询

    我无法弄清楚以下代码有什么问题 语法没问题 用 SQL Management Studio 检查 我可以按照我应该的方式访问 这样也可以工作 但由于某种原因 一旦我尝试通过 PyODBC 创建表 它就会停止工作 import pyodbc
  • 2D 模式搜索算法

    我需要学习二维模式搜索算法 非常感谢提示和链接 更重要的是 给定一个 M m n 矩阵 其值在 K 中 example 000000000000000001000000 010100010010 M K 0 1 010100010001 1
  • 覆盖私有方法时的奇怪行为

    考虑下面的代码 class foo private function m echo foo gt m public function call this gt m class bar extends foo private function
  • 为什么这不能用作数组成员资格测试? [复制]

    这个问题在这里已经有答案了 gt gt gt 5 in 1 2 3 4 False False 我知道这是一种奇怪的测试会员资格的方式 而且 gt gt gt 5 not in 1 2 3 4 True 是 正确 的方式 令我困惑的是它的行
  • TypeScript 中的“as const”是什么意思?它的用例是什么?

    我很困惑as const投掷 我查了一些文档和视频 但没有完全理解 我关心的是as const下面代码中的意思是什么 使用它有什么好处 const args 8 5 as const const angle Math atan2 args