【问题标题】:TypeScript Property Decorator Not WorkingTypeScript 属性装饰器不工作
【发布时间】:2018-01-11 08:11:43
【问题描述】:

这是一个简单的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 出现恐慌。

我在这里做错了什么?

【问题讨论】:

    标签: javascript typescript decorator


    【解决方案1】:

    你得到undefined的原因是因为你从来没有定义过一个值:

    private _var: string = 'val';
    

    此外,TypeScript 不会更改 Foo 类的类型以包含您添加的装饰器属性,这就是为什么它会告诉您“var 不存在于类型 Foo,您的意思是 _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;
    

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 2020-06-20
      • 2021-05-17
      • 1970-01-01
      • 2021-01-03
      • 2021-10-26
      • 2018-07-20
      • 2021-06-25
      • 1970-01-01
      相关资源
      最近更新 更多