我有以下的TypeScript类
module Test {
"use strict";
class Foo {
public static name = "foo";
}
}
相当简单。
但是当在Chrome中运行时,我得到以下错误:
下面是生成的javascript:未捕获的类型错误:不能分配给函数'function Foo(){}'的只读属性'name'
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";
}
}
怎么回事?
问题似乎是您试图写Function.name
。在您最初编写的代码中,您可以在编译后的代码中看到您正在更改Foo.name
。
考虑以下代码
function Foo(){}
console.log(Foo.name); // prints 'Foo'
这个错误是因为你试图改变这个函数的属性,并且不允许这样做(read-only property ..
)。关于为什么(以及如何)不允许这样做的更多信息可以在这里找到。感谢@ ssubbe在评论中提供这个链接
因此,虽然您没有自己创建该属性,但您的所有函数实际上都具有该属性。你可以查看这个页面了解更多信息。
问题是Foo.name = "foo";
,因为name是javascript中函数的预定义属性(如arguments, length等),它包含函数的名称(在您的情况下为'Foo'),因此您不能用自己的定义重写它
详情请看Mozilla的MDN