TypeScript 属性装饰器的错误文档?

gev0vcfq  于 5个月前  发布在  TypeScript
关注(0)|答案(7)|浏览(173)

https://www.typescriptlang.org/docs/handbook/decorators.html
..它位于“属性装饰器”下阅读

If the property decorator returns a value, it will be used as the Property Descriptor for the member.

NOTE  The return value is ignored if your script target is less than ES5.

我正在运行一个简单的ES6目标示例

function MyPropDesc() {
  return function (targetProto: Object, propName: string | symbol)   {
    return {
      get: function() { console.log('in getter') }
    }
  }
}

class SomeClass {
  @MyPropDesc()
  someMember;
}

然而,这似乎不起作用。此外,在调试此代码时,我的属性装饰器是从Reflect.js的DecoratePropertyWithoutDescriptor调用的,它忽略了描述符的结果。而且...TypeScript要求装饰器返回voidany。文档错误?

yhuiod9q

yhuiod9q1#

你的代码在我添加 as any 到返回语句后对我来说运行正常。无论如何,访问属性的值会导致
in getter
被记录。

fquxozlt

fquxozlt2#

实际上,我认为存在一个文档问题,因为它似乎在针对ES5时也能正常工作。

drkbr07n

drkbr07n3#

这仅适用于方法装饰器,而不是属性。对于属性,您应该在装饰器中使用 Object.defineProperty。文档中有一个与OP中引用的行上方具有此含义的部分:
注意
由于TypeScript中属性装饰器的初始化方式,不会将属性描述符作为属性装饰器的参数提供。这是因为目前没有在定义原型成员时描述示例属性的机制,也没有观察或修改属性初始化器的方法。因此,属性装饰器只能用于观察特定名称的属性是否已为类声明。

euoag5mw

euoag5mw4#

@mhegazy 查看 ESnext 文档,看起来它们的属性装饰器传递了一个属性描述符:
https://github.com/tc39/proposal-decorators/blob/master/METAPROGRAMMING.md

class Demo {
  @prototypeProp
  x = 1
}
The public field x above would be represented as the following class element descriptor, which will be passed into our decorator function:
{
  kind: "field"
  key: "x",
  placement: "own",
  // property descriptor for Object.defineProperty
  descriptor: { configurable: false, enumerable: true, writable: true },
  initializer: () => 1
}

TypeScript 最终是否也会支持这一点?我寻找关于这个问题的开放问题,但找不到。
谢谢!

sdnqo3pr

sdnqo3pr5#

当前TS中装饰器的实现是规范的前一个迭代版本。在当前规范达到第三阶段之前,我们将等待并实施它。

kadbb459

kadbb4596#

当然,我知道TS的"等待第三阶段"立场,我认为这是有道理的。

我想这可能是过早的事情,但是一个占位符"支持ESnext装饰器一旦它们进入第三阶段"问题可能会对像我这样的其他人有所帮助(例如,我查看了开放的"领域:装饰器"问题,但没有看到任何内容)。也许这是显而易见的。

此外,感谢Object.defineProperty提示,在属性装饰器中使用它让我能够在当前的TS中做我需要做的事情。

u91tlkcl

u91tlkcl7#

它已经在我的清单上一段时间了。我应该为那个问题提交一个问题,并将不同的问题链接到它。

相关问题