当前位置:  开发笔记 > 编程语言 > 正文

访问类内的元注释(TypeScript)

如何解决《访问类内的元注释(TypeScript)》经验,为你挑选了2个好方法。



1> PierreDuc..:

您可以将注释/装饰器视为普通函数调用.对于此函数,"类/函数"对象(非实例)将在第一个参数中发送,而参数(元数据)在第二个参数中发送.

但是,如果将某些内容添加到类的原型(糟糕的做法/暴露属性),它将取决于该函数的实现.TypeScript编译器和Angular2的工作方式不同.

它们使用由TypeScript编译器生成的Reflect__decorate函数.使用Object.defineProperty()函数添加数据.对此负责的包是Reflect.(引擎盖下使用的__metadata功能与a组合Object.defineProperty()).

该函数WeakMap用于设置注释,并获得明显的注释Reflect.defineMetadata().

TLDR;

要从angular2中的类/组件获取注释,您必须使用:

const annotations = Reflect.getOwnPropertyDescriptor(MyModule, '__annotations__').value;

要从angular2中的构造函数参数获取注释,您必须使用:

Reflect.getMetadata('annotations', ComponentClass); //@Component({}), @Pipe({}), ...

要从angular2中的类中的属性获取注释,您必须使用:

Reflect.getMetadata('parameters', ComponentClass); //@Inject()



2> Jeff Fairley..:

@PierreDuc的答案在Angular 5中对我不起作用。我做了一些进一步的阅读(很抱歉,我找不到共享的所有相关链接),并提出了以下内容:

let decorator: Type;
// you can cast the component class
decorator = (AppComponent).__annotations__[0];
// or use with lodash.get
decorator = get(AppComponent, '__annotations__[0]');

//
// obviously, this is an array, and based on your app,
// you may have multiple decorators on one class, so iterate them
//


// if you want to just grab some data from the @Component:
const templateUrl: string = decorator.templateUrl;
// or from a @NgModule:
const declarations: Type[] = decorator.declarations;


// or if you're trying to decide whether this is in fact a component:
if (decorator instanceof Component) {
  // do things
}
// or a provider
if (decorator instanceof Injectable) {
  // do different things
}
// or a module:
if (decorator instanceof NgModule) {
  // do things
}

// etc...

我尚未将我的应用程序升级到Angular 6,因此我还没有验证这没有更改。

有关:

这是有关创建自定义装饰器的任何有趣文章:https : //blog.angularindepth.com/implementing-custom-component-decorator-in-angular-4d037d5a3f0d

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有