2

在这个plunker 中,我试图用自定义注释装饰 MyModel 上的属性。使用自定义装饰器取消注释属性或取消注释import 'reflect-metadata';并且使用内联装饰器生成的属性:

Error: Cannot resolve all parameters for 'Parser'(?). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'Parser' is decorated with Injectable. at NoAnnotationError.ZoneAwareError

我可以只取消注释内联装饰器,但在编辑器中,import 'reflect-metadata';您不会收到关于 metadata() 不是 Reflect 属性的代码自动完成和 tsc 错误。

以角度使用反射 API 的正确方法是什么?

编辑:
使用一个新的@angular/cli 生成的应用程序import 'core-js/es7/reflect';,但如果你尝试任何 Reflect.metadata() 组合,pollyfills.ts你仍然会得到Property 'metadata' does not exist on type 'typeof Reflect'.

Edit2:我似乎通过替换import 'core-js/es7/reflect';import 'reflect-metadata';in来在 angular cli 中工作,pollyfills.ts但我不知道它们是否是一对一的替代品,或者是否有后果。我不清楚这里的答案。Angular2 使用 npm reflect-metadata 或 core-js/es7/reflect

4

1 回答 1

1

我刚刚偶然发现这篇文章可能会有所帮助。我想解决“第二个问题”的部分可能会让您感兴趣。我在尝试在 Angular 应用程序中定义一些元数据时遇到了同样的问题,似乎 Angular 提供的 Reflect 与 window 不同。所以访问windows的反射似乎为我解决了这个问题。我用了:

let reflect = window['Reflect'];
reflect.defineMetadata(metadataKey, metadataValue, target);

代替

Reflect.defineMetadata(metadataKey, metadataValue, target);
于 2017-03-07T09:20:08.967 回答