如何确定特定属性是否用特定注释装饰?
例如此类:
class A {
@DecoratedWithThis
thisProp: number;
}
我怎么知道thisProp
是用DecoratedWithThis
装饰的?
我的用例:我使用另一个文件中的类为属性生成代码和HTML。
您能想到其他解决方案吗?
答案 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