我正在研究 typescript 1.5,我在尝试为我的属性(property)制作一个简单的装饰器时遇到了一个小问题。
事实上,我需要在应用程序运行时在我的属性中注入(inject)一个字符串。真的很简单,但我不知道如何处理。我已经阅读了很多示例,但没有看到我需要什么,只需在我的变量中注入(inject)一个字符串。
export class MyClass {
@Log
filePath:string;
constructor() {
}
logMe() {
console.log(this.filePath);
}
}
function Log() {
return function (target, key, descriptor) {
console.log(target);
console.log(key);
console.log(descriptor);
descriptor.Log = "I m logged";
return descriptor;
}
}
我的 logMe 函数记录了一个未定义的值。我以前从未使用过装饰器,这就是为什么我需要一个非常简单的案例。
你能帮帮我吗?
感谢提前
最佳答案
首先,属性装饰器的签名如下所示:
type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
更改您的装饰器以匹配此签名。
其次,由于您没有向装饰器传递任何参数,您应该直接在 Log
函数上定义参数。
此时,您可以将字符串分配给定义装饰器的相应原型(prototype)属性。你应该得到以下结果:
function Log(target: Object, propertyKey: string | symbol) {
target[propertyKey] = "I'm logged";
}
现在当运行你的方法时,它会默认输出I'm logged
:
var c = new MyClass();
c.logMe(); // outputs: I'm logged
c.filePath = "test";
c.logMe(); // outputs: test
为了让您更好地理解这一点,这里有一个带有参数的示例:
function Log(defaultValue = "I'm logged") {
return function (target: Object, propertyKey: string | symbol) {
target[propertyKey] = defaultValue;
};
}
请注意,在执行此操作时,您必须始终使用括号进行修饰,如下所示:@Log()
。如果您只是执行 @Log
,它不会给出错误。当前有一个 open issue关于这个。
关于javascript - 带有 String 的 TypeScript 简单装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30467906/