为什么打字机ReadonlyArrays在编译为javascript时是mutlabe

Hyy*_*her 4 javascript typescript

我正在尝试从官方文档中学习Typescript .在接口部分,我已经阅读了以下内容:

TypeScript附带一个ReadonlyArray类型,与Array相同, 删除了所有变异方法,因此您可以确保在创建后不更改数组:

我玩过以下示例代码来测试案例:

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!
Run Code Online (Sandbox Code Playgroud)

我发现以前的代码编译成这样的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
Run Code Online (Sandbox Code Playgroud)

ro现在可以在javascript中看到它是可变的,而其他javascript代码可以更改它,为什么typescript没有创建Array删除可变方法的对象的子类ro?!我在这里失踪了什么?!

Fen*_*ton 5

总的来说,TypeScript不会在运行时尝试侵入.早期就如下事项进行了讨论:

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

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

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

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