类有静态成员' name '时出现类型错误

TypeError when class has static member `name`

本文关键字:类型 错误 name 静态成员      更新时间:2023-09-26

我有以下的TypeScript类

module Test {
    "use strict";
    class Foo {
        public static name = "foo";
    }
}

相当简单。

但是当在Chrome中运行时,我得到以下错误:

未捕获的类型错误:不能分配给函数'function Foo(){}'的只读属性'name'

下面是生成的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";
    }
}

怎么回事?

问题似乎是您试图写Function.name。在您最初编写的代码中,您可以在编译后的代码中看到您正在更改Foo.name

考虑以下代码

  function Foo(){}
  console.log(Foo.name); // prints 'Foo'

这个错误是因为你试图改变这个函数的属性,并且不允许这样做(read-only property ..)。关于为什么(以及如何)不允许这样做的更多信息可以在这里找到。感谢@ ssubbe在评论中提供这个链接

因此,虽然您没有自己创建该属性,但您的所有函数实际上都具有该属性。你可以查看这个页面了解更多信息。

问题是Foo.name = "foo";,因为name是javascript中函数的预定义属性(如argumentslength等),它包含函数的名称(在您的情况下为'Foo'),因此您不能用自己的定义重写它

详情请看Mozilla的MDN