javascript - 为什么 typescript ReadonlyArrays 在编译为 javascript 时是 mutlabe
问题描述
我正在尝试从官方文档中学习 Typescript 。在接口部分,我阅读了以下内容:
TypeScript 带有与Array相同 的ReadonlyArray类型,删除了所有变异方法,因此您可以确保在创建后不更改数组:
我已经使用以下示例代码来测试案例:
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
ro[0] = 12; // error!
ro.push(5); // error!
ro.length = 100; // error!
a = ro; // error!
我发现之前的代码是这样编译成javascript的
var a = [1, 2, 3, 4];
var ro = a;
ro[0] = 12; // works
ro.push(5); // works
ro.length = 100; // works
a = ro; // works
您可以看到它ro
现在在 javascript 中是可变的,并且其他 javascript 代码可以更改它,为什么 typescript 没有创建一个Array
对象的子类来删除可变方法ro
?!我在这里想念什么?!
解决方案
总的来说,TypeScript 不会在运行时尝试侵入。早期有关于以下内容的讨论:
- 在运行时强制类型
- 使私有变量在运行时实际上是私有的
...可能还有更微妙但类似的问题。
结果是 TypeScript 不想接管 JavaScript,所以它在设计和编译时工作,并在最后输出惯用的 JavaScript。
这意味着在许多情况下,TypeScript 规则可能会在其他代码中被违反,例如访问修饰符和只读数组——但这不是项目的目标。
推荐阅读
- c# - Oracle TO_DATE() 函数
- javascript - 如何为应用促销代码创建完整的功能
- c++ - 在没有默认可构造性的 constexpr 环境中获取任何类型的值
- ios - 如何在 Xamarin、IOS 中使用 SDWebImage 绑定
- javascript - Angular Material:在编辑时更新数据源的最佳方式?
- apache - Apache 中的服务器名称指令
- php - 回显数据库字段时如何更改日期格式?
- sql - 使用 PostgreSQL 创建触发器
- python - requirements.txt 中的 Dask 数据框?
- r - 选择R中向量中的所有值组合