2

我只是想分享一下与 TypeScript 装饰器的短暂斗争的结果。

我试图从属性装饰器中更改属性描述符,例如为了使属性可编号:

export function MyPropDecorator<T>(options: {enumerable: boolean, <other options...> }) {
    return function (target: any, key: string): any {
        let type = Reflect.getMetadata("design:type", target, key);
        let pd = Object.getOwnPropertyDescriptor(target, key);
        pd.enumerbale = options.enumerable;
        Object.defineProperty(target, key, pd);
        ...
    }
}

但是一旦离开装饰器功能,“eumerable”就以某种方式变回了“false”。问题是不能在属性装饰器中调用“Object.defineProperty”,因为 TypeScript 的“__decorate”函数会覆盖它。 诀窍是返回修改后的属性描述符

export function MyPropDecorator<T>(options: {enumerable: boolean, <other options...> }) {
    return function (target: any, key: string): any {
        let type = Reflect.getMetadata("design:type", target, key);
        let pd = Object.getOwnPropertyDescriptor(target, key);
        pd.enumerbale = options.enumerable;
        return pd;
    }
}
4

0 回答 0