属性装饰器-不同的setter和getter类型

时间:2019-09-10 15:11:27

标签: javascript typescript

以下装饰器仅用作简单示例。请不要试图弄清楚它是否有意义。

export function ToString(target: Object, key: string) {
  let parsedValue: string;

  Object.defineProperty(target, key, {
    get: () => parsedValue,
    set: (value: number) => parsedValue = number.toString()
  });
}

如您所见,上面的装饰器将'number'作为参数,并在最后一步返回相同的值,但已解析为字符串。

设置类型->数字,获取类型->字符串

不幸的是,以下表示法是错误的

class TestClass {
  @ToString parsedValue: string = 5; // number is not assignable to string
}

我们知道ToString装饰器将解析该值,但是我们不能将装饰的属性键入为字符串。

解决方法是将setter值传递给装饰器,如下所示:

export function ToString(value: number) {
  return (target: Object, key: string) {
    let parsedValue: string;

    Object.defineProperty(target, key, {
      get: () => parsedValue,
      set: (value: number) => parsedValue = number.toString()
    });
  }
}

class TestClass {
  @ToString(5) parsedValue: string; // it's okay because we don't use setter here
}

除非我们想在将值传递给装饰器时使用this上下文,否则一切都会好起来的。

class TestClass {
  @ToString(this.someService.value) parsedValue: string;

  constructor(private someService = {value: 5}) {
  }
}

this在此阶段未定义。有没有不使用any类型就可以达到预期结果的方法? :)

0 个答案:

没有答案