尽管设置了元数据,Reflect.getMetadata()仍返回undefined



我正在尝试在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

我也可以很容易地访问__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...
}

相关内容

  • 没有找到相关文章

最新更新