javascript - 为什么 typescript ReadonlyArrays 在编译为 javascript 时是 mutlabe

标签 javascript typescript

我正在尝试从 official documentation 学习 Typescript . 而在 Interfaces section我已阅读以下内容:

TypeScript comes with a ReadonlyArray type that is the same as Array with all mutating methods removed, so you can make sure you don’t change your arrays after creation:

我已经使用以下示例代码来测试案例:

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 不会试图在运行时进行侵入。早期曾讨论过以下问题:

  • 在运行时强制类型
  • 使私有(private)变量在运行时真正私有(private)

...可能还有更微妙但相似的问题。

结果是 TypeScript 不想接管 JavaScript,所以它在设计和编译时工作,并在最后输出惯用的 JavaScript。

这意味着在很多情况下,其他代码(例如访问修饰符和只读数组)可能会违反 TypeScript 规则 - 但这不是该项目的目标。

关于javascript - 为什么 typescript ReadonlyArrays 在编译为 javascript 时是 mutlabe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51785780/

相关文章:

javascript - 如何在 Angular 2 类中使用时刻时区?

angular - 如何在 View 初始化后运行代码并且 Promise 从 Angular 2 中的数据库返回数据

javascript - 使用 jQuery 过滤 html 字段

javascript - Chrome 浏览器自动向下滚动内容(当没有人要求时)

javascript - 如何将任意点旋转任意 Angular ?

Angular 8 Native Typescript 无崩溃,访问器简写

typescript - 如何使用普通对象的值创建类型?

reactjs - typescript 高阶组件

javascript - jqgrid加载数组数据

javascript - 如何通过 onclick 事件禁用 SmartyStreets/LiveAddress