我有以下TypeScript类
module Test {
"use strict";
class Foo {
public static name = "foo";
}
}
非常简单。
但是在Chrome中运行时出现以下错误:
未捕获的TypeError:无法分配给只读属性' name'功能'功能Foo(){}'
这是生成的javascript:
var Test;
(function (Test) {
"use strict";
var Foo = (function () {
function Foo() {
}
Foo.name = "foo";
return Foo;
}());
})(Test || (Test = {}));

如果我使用其他名称,那么name
我就不会收到错误。
module Test {
"use strict";
class Foo {
public static huh = "foo";
}
}
发生了什么事?
答案 0 :(得分:5)
问题似乎是您正试图写信给Function.name
。在您最初编写的代码中,您可以在已编译的代码中看到您正在更改Foo.name
。
只考虑这段代码
function Foo(){}
console.log(Foo.name); // prints 'Foo'
错误是因为您尝试更改此函数的属性,并且不允许这样做(read-only property ..
)。有关您不被允许这样做的原因(以及如何)的更多信息可以在here找到。感谢@ssube在评论中提供此链接
因此,虽然您没有自己创建该属性,但您的所有功能确实拥有它。您可以查看this page以获取更多信息。
答案 1 :(得分:2)
问题是Foo.name = "foo";
,因为 name 是javascript中函数的预定义属性(如 arguments , length 等) ,其中包含函数的名称(在您的情况下为'Foo'),因此您无法使用自己的定义覆盖它
查看Mozilla's MDN了解详情