为什么将打字稿ReadonlyArrays编译为javascript时是可变的

时间:2018-08-10 11:44:12

标签: javascript typescript

我正在尝试从official documentation学习打字稿。 在Interfaces section中,我阅读了以下内容:

  

TypeScript带有 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代码也可以更改它,为什么打字稿没有创建Array对象的子类,而其中{{1 }} ?!我在这里想念的是什么?!

2 个答案:

答案 0 :(得分:5)

总体而言,

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

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

...以及可能更细微但相似的问题。

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

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

答案 1 :(得分:1)

这是因为接口和类型(如访问修饰符(私有和公共))只是Typescript概念,无法在编译过程中幸存: 在编码时 ,编译器/ IDE在执行错误操作时会警告您,但是一旦您的代码变成纯Javascript,就不会阻止您将字符串分配给已声明的数字变量或访问私有成员。

仅是在线演示中的一个示例:

enter image description here

您会看到Typescript代码中有两个错误(左):

  • 该属性是私有的
  • 该属性不是数字

但是一旦转译,该代码即为有效代码(实际上,如果您单击“运行”,则可以)。

类型和接口仅用于帮助检测潜在的错误,但它们在运行时不存在