首页 > 解决方案 > 为什么 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?!我在这里想念什么?!

标签: javascripttypescript

解决方案


总的来说,TypeScript 不会在运行时尝试侵入。早期有关于以下内容的讨论:

  • 在运行时强制类型
  • 使私有变量在运行时实际上是私有的

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

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

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


推荐阅读