【问题标题】:Reflect.getMetadata() returns undefined although metadata is set尽管设置了元数据,但 Reflect.getMetadata() 返回 undefined
【发布时间】:2022-08-17 07:02:08
【问题描述】:

我正在尝试在我的 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 实例时,我看到它的原型中设置了元数据:

  • 我的班级:我的班级
    • prop1:\'foo\'
    • prop2:\'酒吧\'
    • [[原型]]:对象
      • __metadata__:
        • 道具2:
          • json忽略:真

我还可以轻松访问__metadata__ 和它的条目(Object.getPrototypeOf(myClass).__metadata__.prop2.jsonIgnore),但是当它有一个 API 并且很可能无法在不同的浏览器中工作时,这绝对是一个 hack?

所以如果有人能指出我做错了什么......那将非常感激!

更多信息: tsconfig.json:

\"compilerOptions\": {
    ...
    \"experimentalDecorators\": true,
    \"emitDecoratorMetadata\": true,
}

    标签: typescript annotations metadata reflect decoration


    【解决方案1】:

    看起来您已将元数据键定义为字符串。 按照 TypeScript 文档here 中的说明,您需要将键定义为符号。我还注意到 Symbol 实际上需要在装饰器和使用元数据的函数中是同一个实例。尝试这个:

        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...
         }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 2014-02-26
      • 2021-10-22
      • 2018-03-15
      • 2020-11-07
      • 1970-01-01
      • 2021-03-18
      相关资源
      最近更新 更多