在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要求装饰器返回void
或any
。文档错误?
7条答案
按热度按时间yhuiod9q1#
你的代码在我添加
as any
到返回语句后对我来说运行正常。无论如何,访问属性的值会导致in getter
被记录。
fquxozlt2#
实际上,我认为存在一个文档问题,因为它似乎在针对ES5时也能正常工作。
drkbr07n3#
这仅适用于方法装饰器,而不是属性。对于属性,您应该在装饰器中使用
Object.defineProperty
。文档中有一个与OP中引用的行上方具有此含义的部分:注意
由于TypeScript中属性装饰器的初始化方式,不会将属性描述符作为属性装饰器的参数提供。这是因为目前没有在定义原型成员时描述示例属性的机制,也没有观察或修改属性初始化器的方法。因此,属性装饰器只能用于观察特定名称的属性是否已为类声明。
euoag5mw4#
@mhegazy 查看 ESnext 文档,看起来它们的属性装饰器传递了一个属性描述符:
https://github.com/tc39/proposal-decorators/blob/master/METAPROGRAMMING.md
TypeScript 最终是否也会支持这一点?我寻找关于这个问题的开放问题,但找不到。
谢谢!
sdnqo3pr5#
当前TS中装饰器的实现是规范的前一个迭代版本。在当前规范达到第三阶段之前,我们将等待并实施它。
kadbb4596#
当然,我知道TS的"等待第三阶段"立场,我认为这是有道理的。
我想这可能是过早的事情,但是一个占位符"支持ESnext装饰器一旦它们进入第三阶段"问题可能会对像我这样的其他人有所帮助(例如,我查看了开放的"领域:装饰器"问题,但没有看到任何内容)。也许这是显而易见的。
此外,感谢Object.defineProperty提示,在属性装饰器中使用它让我能够在当前的TS中做我需要做的事情。
u91tlkcl7#
它已经在我的清单上一段时间了。我应该为那个问题提交一个问题,并将不同的问题链接到它。