在Typescript装饰器中修改属性值

时间:2019-08-17 08:19:25

标签: typescript typescript-decorator

我在Angular Service中有类级别的变量。我需要通过装饰器为变量值添加一些值。我该如何实现?

{ 'a': 'x' }

{ 
    'a': 'b',
    'c': [1,2,99]
}

以上代码应在MicroService.NAME之前添加apiURL。 如果MicroService.NAME的值为'authService',则该值为 的apiURL必须更改为'authService / api / login'。

如果达到上述要求,那么我可以在Http Interceptor中用其URL替换微服务名称。(http://my.ip:port/api/login

我是新来的装饰工。我在互联网上找不到合适的解决方案。

1 个答案:

答案 0 :(得分:1)

import "reflect-metadata";

const enum MicroService {
  NAME = "microserviceName/"
}

function Service(prefix: string): PropertyDecorator {
  return (target, key): void => {
    let original = target[key];
    Reflect.deleteProperty(target, key);
    Reflect.defineProperty(target, key, {
      get: () => original,
      set: newVal => {
        original = `${prefix}${newVal}`;
      },
      enumerable: true,
      configurable: true
    });
  };
}

export class MyClass {
  @Service(MicroService.NAME)
  public foo: string = "hello";

  public exec(): string {
    return this.foo;
  }
}

const c = new MyClass();

console.log(c.foo); // - prints: microserviceName/hello

c.foo = "test";

console.log(c.foo); // - prints: microserviceName/test