javascript - typescript 类装饰器 : typing properties defined in decorator function

标签 javascript class typescript decorator typeof

bar 是一个简单的类装饰器,它向类 Foo 添加一个属性。

function bar(target) {
    target.inDecorator = 'in decorator';
}

@bar
class Foo {
    inClass:string;
    inDecorator:string;
    constructor() {
        this.inClass = 'a string';
    }

    getInClass() {
        return this.inClass;
    }
}

console.log(Foo.inDecorator);
console.log(Foo.prototype.inDecorator);
const foo = new Foo();
console.log(foo.getInClass());
console.log(foo.inDecorator);

唯一导致错误的控制台日志是第一个,Foo.inDecorator,在 ts 1.5.3 中包含它给出

Property 'inDecorator' does not exist on type 'typeof Foo'.

据我所知,inDecorator 应该在类 Foo 的原型(prototype)上定义,并且应该在 Foo 上可用,就好像它是静态 Prop 一样。运行生成的 js 文件显示未定义的原型(prototype)访问以及新的 foo 对象,但是 Foo.inDecorator 打印正确,即使它是错误的来源。更清楚地说,我们得到

in decorator
undefined
a string
undefined

关于如何正确输入/添加静态属性或方法有什么想法吗?

谢谢!

编辑这个是因为我最初忽略了原型(prototype)访问 Foo.prototype.inDecorator 不起作用的事实。

最佳答案

在装饰器中,target 指的是函数——Foo——而不是原型(prototype)——Foo.prototype

所以在装饰器中执行 target.inDecorator = ...Foo.inDecorator = ... 相同,而不是 Foo.prototype.inDecorator = ...

这是一种实现方式:

interface BarStatic {
    new(): BarInstance;
    inDecorator: string;
}

interface BarInstance {
    inDecorator: string;
}

function bar(target: BarStatic) {
    target.inDecorator = 'static';
    // note that prototype will be `any` here though
    target.prototype.inDecorator = 'instance';
}

@bar
class Foo {
    static inDecorator: string; // required
    inDecorator: string;        // required
    inClass: string;

    constructor() {
        this.inClass = 'a string';
    }

    getInClass() {
        return this.inClass;
    }
}

console.log(Foo.inDecorator);           // static
console.log(Foo.prototype.inDecorator); // instance
const foo = new Foo();
console.log(foo.getInClass());          // a string
console.log(foo.inDecorator);           // instance

关于javascript - typescript 类装饰器 : typing properties defined in decorator function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31757926/

相关文章:

javascript - 先按字母排序,再按数字排序

javascript - 我如何从另一个外部 javascript 文件中的外部 javascript 文件调用函数?

javascript - 作为参数传递的函数,有自己的未定义参数,但仍然有值

java - 使用 Class.forName 调用类

java 汇编的二进制文件根据源文件的顺序而变化

除非使用 setTimeout(),否则 JavaScript 重定向 (location.href) 会破坏后退按钮

c++ - 在类中定义公共(public)结构

javascript - TypeScript的类型推断功能在情况1下可以正常工作,但在另一种情况下会引发错误

javascript - 如何保存用户信息(用户名)firebase new Angular 2