我正在尝试在TypeScript应用程序中使用注释。然而,我一定做错了什么,因为Reflect.getMetadata()
总是返回undefined
,尽管我在调试器中看到元数据似乎设置正确。
带有注释属性的my-class.ts:
import { jsonIgnore } from './json-ignor';
export class MyClass {
public prop1: string;
@jsonIgnore() public prop2: string;
}
带有装饰和注释功能的json-ignore.ts:
const JSON_IGNORE = 'jsonIgnore';
export function jsonIgnore(): any {
return Reflect.metadata(JSON_IGNORE, true);
}
export function jsonIgnoreReplacer(key: string, value: any): any {
const meta = Reflect.getMetadata(metadataKey, object, propertyKey);
// do something with the metadata...
}
现在meta
总是undefined
。但是,当我在调试器中检查MyClass
实例时,我发现它的原型中设置了元数据:
- myClass:myClass
- prop1:"foo">
- prop2:"bar">
- [[Prototype]]:对象
- __元数据__:
- prop2:
- jsonIgnore:true
- prop2:
- __元数据__:
我也可以很容易地访问__metadata__
和它的条目(Object.getPrototypeOf(myClass).__metadata__.prop2.jsonIgnore
(,但当有API时,这肯定是一个破解,很可能无法在不同的浏览器中工作?
所以如果有人能指出我做错了什么。。。非常感谢!
更多信息:tsconfig.json:
"compilerOptions": {
...
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
}
看起来您已经将元数据键定义为字符串。按照TypeScript文档中的说明,您需要将键定义为Symbol。我还注意到Symbol实际上需要是decorator和使用元数据的函数中的相同实例。试试这个:
const jsonIgnoreMetadataKey = Symbol("jsonIgnore");
export function jsonIgnore(): any {
return Reflect.metadata(jsonIgnoreMetadataKey , true);
}
export function jsonIgnoreReplacer(key: string, value: any): any {
const meta = Reflect.getMetadata(jsonIgnoreMetadataKey , object, propertyKey);
// do something with the metadata...
}