javascript - 带有 String 的 TypeScript 简单装饰器

标签 javascript typescript

我正在研究 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

Playground


为了让您更好地理解这一点,这里有一个带有参数的示例:

function Log(defaultValue = "I'm logged") {
    return function (target: Object, propertyKey: string | symbol) {
        target[propertyKey] = defaultValue;
    };
}

请注意,在执行此操作时,您必须始终使用括号进行修饰,如下所示:@Log()。如果您只是执行 @Log,它不会给出错误。当前有一个 open issue关于这个。

Playground

关于javascript - 带有 String 的 TypeScript 简单装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30467906/

相关文章:

javascript - angular2 i18n 的替代品

javascript - 从类名创建一个新对象并将类名作为字符串传递

node.js - (node.js 模块)sharp 图像处理器保持源文件打开,调整大小后无法取消链接原始文件

visual-studio - TypeScript 仅发出一次样板代码

引用时未定义 Angular 6 属性指令

javascript - 使用jquery检查表单中的所有条件

javascript - jQuery $(window).resize() 是否会覆盖现有事件?

typescript - 在 Typescript 中返回嵌套数组类型

javascript - Vue 自定义元素无法在 Dist 中构建独立的 JS 文件

javascript - 使用 jquery 在 JSON 中搜索并显示结果