以下装饰器仅用作简单示例。请不要试图弄清楚它是否有意义。
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
类型就可以达到预期结果的方法? :)