TypeScript 静态字段应该安装在被装饰的类上,

voase2hg  于 5个月前  发布在  TypeScript
关注(0)|答案(3)|浏览(134)

🔎 搜索词

装饰器类静态字段

🕗 版本与回归信息

  • 这是一次崩溃
  • 在版本______和______之间发生了变化
  • 在提交或PR______中发生了变化
  • 在我尝试的每个版本中(在ES装饰器实现后),我都查看了关于装饰器的FAQ条目,并且我检查了这个行为
  • 我无法在之前的版本上测试这个,因为______

⏯ Playground链接

https://www.typescriptlang.org/play?useDefineForClassFields=true&target=9&ts=5.4.0-dev.20240130#code/DYUwLgBA8gTglgczgOwIbAGIHssG4BQ+AxsKgM5kQBCqMEA3gL6EBmArskWHFshACYgiACmxYAlA3wRo8JGkw4IAXghiCMmODYw+NGAWb4AAoKLFSFNUvrSIZMKm5EIABw33HziKiJEQFFh0qB4OTnAuALbCkkz4RkS8ZFigAHTAWAjC+qkAFuRQAO7IAAowWK4gMGAAnsIARK714gA01LR5BcVlFVW1DajNbTn5ZEWl5ZXVdfWRzeIEicjJaRlZsIgo6GKdY92TfTNNrbKbCjuj4z1T-fWDJxvy2zi7VwfTDXPiC0A

💻 代码

let OriginalFoo;

class Bar {}

function dec(Foo) {
  OriginalFoo = Foo;
  return Bar;
}

@dec
class Foo {
  static p;
  static accessor a;
  static m() {}
}

console.log(Bar.hasOwnProperty("p"), Bar.hasOwnProperty("a"), Bar.hasOwnProperty("m"));
console.log(OriginalFoo.hasOwnProperty("p"), OriginalFoo.hasOwnProperty("a"), OriginalFoo.hasOwnProperty("m"));

🙁 实际行为

它打印出

false,  false,  false 
true,  true,  true

🙂 预期行为

它应该打印出

true, true, false
false, false, true
qij5mzcb

qij5mzcb1#

我再次检查了规格,我记得静态访问器应该安装在OriginalFoo上,但是它的后备存储私有字段应该安装在Bar上,所以访问OriginalFoo.a应该抛出一个错误,因为存储密钥没有在OriginalFoo上定义,但无论如何OriginalFoo.hasOwnProperty("a")都应该返回true

wswtfjt7

wswtfjt72#

根据规范(以及在您的其他评论中反映的),它实际上应该打印

true, false, false
false, true, true

访问 OriginalFoo.a 应该抛出一个错误,因为存储密钥未在 OriginalFoo 上定义。
是的,我们目前在访问器上发出 __classPrivateFieldGet(_classThis, _classThis, "f", _Foo_a_accessor_storage) 时,应该发出 __classPrivateFieldGet(this, _classThis, "f", _Foo_a_accessor_storage) 而不是。

wrrgggsh

wrrgggsh3#

根据规范(以及在您的其他评论中反映的),它实际上应该打印

true, false, false
false, true, true

@rbuckton 是的,您说得对,当时我把后备存储键定义与访问器定义混淆了。

相关问题