as const 也是类型断言的一种

这被称为const断言。const断言告诉编译器为表达式推断出它能推断出的最窄或最特定的类型。如果不使用它,编译器将使用其默认类型推断行为,这可能会导致更广泛或更一般的类型。

请注意,它被称为“断言”,而不是“强制转换”。术语“cast”在TypeScript中通常是要避免的;当人们说“cast”时,它们通常意味着某种可以在运行时观察到的效果,但是TypeScript的类型系统,包括类型断言和const断言,从发出的JavaScript中被完全删除。因此,在运行时,使用as const的程序和不使用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[]的类型。这是一个由0个或更多number类型的元素组成的可变数组。编译器不知道有多少或哪些元素。这样的推断通常是合理的;通常,数组内容意味着要以某种方式进行修改。如果有人想写args.push(17)或args[0]++,他们会很乐意使用number[]类型。

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


将其与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]类型。。。一个readonly元组,其值正好是按此顺序排列的数字8和5。具体来说,args.length被编译器精确地称为2。

这就足够下一行使用Math.atan2()了。编译器知道Math.atan2(…args)与Math.atan2(8, 5)相同,这是一个有效的调用。

TypeScript中的“as const”是什么意思?类型断言!相关推荐

  1. 第四节:5种数据类型在TypeScript中的运用

    在上一节<第三节:快速编译TypeScript,提高开发效率>,我们学习了如何结合IDE快速地帮助我们编译TypeScript,有了这个辅助功能,我们的开发效率就大大提高. 接下来,我们就 ...

  2. 用typescript完成倒计时_TypeScript(一):类型

    经过3个月的使用,在 TypeScript 方面学到了一些东西,总结一下. 在您阅读本文之前需要了解到的是,本文的内容仅是个人观点,我也并非 TypeScript 主要维护者和贡献者,也没有邀请 Ty ...

  3. 如何在TypeScript中删除数组项?

    本文翻译自:How do I remove an array item in TypeScript? I have an array that I've created in TypeScript a ...

  4. Typescript中使用Axios

    1)Vue.prototype 在vue项目main.js文件中: Vue.prototype.$appName = 'My App' 这样你可以通过在原型上定义它们使其在每个 Vue 的实例中可用. ...

  5. JavaScript 和 typeScript 中的 import、from

    From:https://segmentfault.com/a/1190000018249137?utm_source=tag-newest Github - allowSyntheticDefaul ...

  6. gettype获取类名_在TypeScript中运行时获取对象的类名

    在TypeScript中运行时获取对象的类名 是否可以使用typescript在运行时获取对象的类/类型名称? class MyClass{} var instance = new MyClass() ...

  7. TypeScript 中类型 any,void,unknown,never之间的区别

    文章出自个人博客 https://knightyun.github.io/2021/04/03/js-ts-type-compare,转载请申明 TypeScript 拓展了 JavaScript 的 ...

  8. 【进阶】TypeScript 中的 Type

    一 .什么是 TypeScript TypeScript 是静态编程语言 , 是 JavaScript 的超集 简而言之:JavaScript 有的 TypeScript 都有.JavaScript ...

  9. TypeScript 中的类型兼容性

    Typescript 乃 JavaScript 子集.只要设置一下编译器为非严格模式,那么所有 JavaScript 代码皆是合法的 TypeScript 代码.为了可以适应不同的场景 TypeScr ...

最新文章

  1. \V110\Microsoft.CppCommon.targets(347,5): error MSB6006: “CL.exe”已退出,代码为 -1073741515。的解决方法
  2. 负载均衡算法 — 轮询
  3. C#实现UTC时间与Datetime转换
  4. POJ 2240题(Floyd)
  5. mysql产品优化方案,MySQL优化方案
  6. 【MySQL】向已有主键的表附加主键属性的自动编号
  7. JAVA Linux 排查CPU 过高的方法
  8. quartz定时器简单使用
  9. 使用matlab导入excel表格带有时间的数据并绘制曲线
  10. 关系数据库之关系代数
  11. JS+CSS竖向折叠滑动菜单代码
  12. c语言延时0.5s程序,C语言延时程序(ms,us)
  13. C语言_断言函数assert
  14. 计算机专业前沿算法,CNCC2018 | 研究经典计算机算法已经过时了吗?
  15. ODI之知识模块(KM)
  16. Python OpenCV Tesseract实现车牌的检测与识别
  17. 软碟通UltraISO v9.6.5.3237去插件官方版
  18. 记录前端常用代码规范
  19. 百度地图鼠标经过图层时高亮显示图标及标签内容
  20. 什么是企业宣传型网站?

热门文章

  1. 自学python能找到工作么-27岁0基础自学Python,多久可以找到工作?
  2. 龙芯looongnix系统开机自动执行脚本
  3. [CTFSHOW]CTFSHOW击剑杯 部分WP
  4. Arduino基础项目一:控制LED灯闪烁
  5. 如何在PPT里绘制具有科技感的色块?
  6. 两招提高孩子识字兴趣和效果
  7. vue table获取复选框选中数据
  8. JavaScript弹出框
  9. 安搭Share带你了解“宅”生活
  10. android美图秀秀--基础