typescript类装饰器:在装饰器函数中定义的输入属性

low*_*ost 5 javascript class typeof decorator typescript

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);
Run Code Online (Sandbox Code Playgroud)

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

Property 'inDecorator' does not exist on type 'typeof Foo'.
Run Code Online (Sandbox Code Playgroud)

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

in decorator
undefined
a string
undefined
Run Code Online (Sandbox Code Playgroud)

关于如何正确输入/添加静态道具或方法的任何想法?

谢谢!

编辑这个,因为我最初忽略了原型访问,Foo.prototype.inDecorator无法正常工作的事实.

Dav*_*ret 4

装饰器内target指的是函数\xe2\x80\x94 Foo\xe2\x80\x94 而不是原型\xe2\x80\x94 Foo.prototype

\n\n

所以在装饰器中所做的事情与和 nottarget.inDecorator = ...相同。Foo.inDecorator = ...Foo.prototype.inDecorator = ...

\n\n

这是一种方法:

\n\n
interface BarStatic {\n    new(): BarInstance;\n    inDecorator: string;\n}\n\ninterface BarInstance {\n    inDecorator: string;\n}\n\nfunction bar(target: BarStatic) {\n    target.inDecorator = 'static';\n    // note that prototype will be `any` here though\n    target.prototype.inDecorator = 'instance';\n}\n\n@bar\nclass Foo {\n    static inDecorator: string; // required\n    inDecorator: string;        // required\n    inClass: string;\n\n    constructor() {\n        this.inClass = 'a string';\n    }\n\n    getInClass() {\n        return this.inClass;\n    }\n}\n\nconsole.log(Foo.inDecorator);           // static\nconsole.log(Foo.prototype.inDecorator); // instance\nconst foo = new Foo();\nconsole.log(foo.getInClass());          // a string\nconsole.log(foo.inDecorator);           // instance\n
Run Code Online (Sandbox Code Playgroud)\n