检查属性是否用特定注释装饰-Typescript

时间:2018-07-04 09:19:41

标签: typescript typescript2.0

如何确定特定属性是否用特定注释装饰?

例如此类:

class A {
    @DecoratedWithThis
    thisProp: number;
}

我怎么知道thisProp是用DecoratedWithThis装饰的?

我的用例:我使用另一个文件中的类为属性生成代码和HTML。

您能想到其他解决方案吗?

2 个答案:

答案 0 :(得分:1)

我在打字稿中没有知道本机的方法,但是有一种方法可以使用“ reflect-metadata”库https://github.com/rbuckton/reflect-metadata来完成,这是对本机反射api的扩展。

装饰器只是定义类时执行的函数。您需要创建一个属性装饰器

function (target, propertyKey) {}

目标是您的Object.prototype,名称是属性名称

每个反映元数据文档

// define metadata on an object or property
Reflect.defineMetadata(metadataKey, metadataValue, target, propertyKey);

// get metadata value of a metadata key on the prototype chain of an object or property
let result = Reflect.getMetadata(metadataKey, target, propertyKey);

您可以通过向属性添加元数据来解决问题,稍后再阅读该元数据以检查该属性是否已装饰。

示例实现

import 'reflect-metadata';

const metadataKey = 'MyDecorator';

function MyDecorator(target, propertyKey) {
    Reflect.defineMetadata(metadataKey, true, target, propertyKey);
}

function myDecoratorUsingClass<T>(type:  Type<T>, propertyKey: string) {
    return myDecoratorUsingInstance(new type(), propertyKey);
}

function myDecoratorUsingInstance<T>(instance: T, propertyKey: string) {
  return !!Reflect.getMetadata(metadataKey, instance, propertyKey);
}

class MyClass {
   @MyDecorator
   property1;
   property2;
}

console.log(myDecoratorUsingClass(MyClass, 'property1')); // true
console.log(myDecoratorUsingClass(MyClass, 'property2')); // false

const instance = new MyClass();
console.log(myDecoratorUsingInstance(instance, 'property1')); // true
console.log(myDecoratorUsingInstance(instance, 'property2')); // false

注意要使用 myDecoratorUsingClass ,您的类应具有一个构造函数,其中所有参数都是可选的(或没有参数)

答案 1 :(得分:0)

由于我不能以新用户身份发表评论,因此我将其发布为新答案,尽管这只是@ h0ss答案的升级。

您可以使用!!Reflect.getMetadata(metadataKey, instance, propertyKey)Reflect.hasMetadata(metadataKey, target, propertyKey)代替Reflect.hasOwnMetadata(metadataKey, target, propertyKey),如此处所述 https://www.npmjs.com/package/reflect-metadata#api