TypeScript Property Decorator不工作

时间:2018-01-11 08:11:44

标签: javascript typescript decorator

这是一个简单的get属性装饰器:

function get(target, name) {
    const key = name.replace(/^_/, '');

    Object.defineProperty(
        target,
        key,
        {
            get: function() {
                return this[name];
            }
        });
}

class Foo {
    @get
    private _var: string;
}

const foo = new Foo();
foo.var;

但是foo.varundefined而TypeScript恐慌。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

获得undefined的原因是因为您从未定义过值:

private _var: string = 'val';

此外,TypeScript不会更改Foo类的类型以包含装饰器添加的属性,这就是为什么它告诉你“类型Foo上不存在var,你的意思是_var吗?”在这一行:

foo.var;

合并

您可以通过接口/类声明合并解决问题:

function get(target, name) {
    const key = name.replace(/^_/, '');

    Object.defineProperty(
        target,
        key,
        {
            get: function() {
                return this[name];
            }
        });
}

interface Foo { var: string;}
class Foo {
    @get
    private _var: string = 'val';
}

const foo = new Foo();
foo.var;

但这可能会破坏尝试减少代码的重点,并引入“如果你改变了类,你必须改变界面”的问题。

简单

虽然我可以看到你试图通过自动属性的形式使你的代码更加简洁,但是如果没有类型支持,这个概念将无法工作,因为自动完成将被误导。

工作代码会很无聊:

class Foo {
    private _var: string = 'val';

    public get var() {
        return _var;
    }
}

const foo = new Foo();
foo.var;