typescript 属性装饰器 同一文件不报错,export就报错,为什么?

export function logParameter() {
    return function(target: Object, propertyName: string) {

    // property value
    let _val = target[propertyName];
    console.log('_val',_val)
    // property getter method
    const getter = () => {
        console.log(`Get: ${propertyName} => ${_val}`);
        return _val;
    };

    // property setter method
    const setter = newVal => {
        console.log(`Set: ${propertyName} => ${newVal}`);
        _val = newVal;
    };

    // Delete property.
    if (delete this[propertyName]) {

        // Create new property with getter and setter
        Object.defineProperty(target, propertyName, {
            get: getter,
            set: setter,
            enumerable: true,
            configurable: true
        });
    }
}
}
fdescribe('FormulaLoad test', () => {
    it('decorat', () => {
        class Run {
            @logParameter()
            name: string = '12';
        }
        // @FormulaCollect('PLUS', 35)
        // class PLUS {
        //     run(exp: any, idx) {
        //         exp.splice(idx - 1, 2, exp[idx - 1]);
        //         return idx - 2;
        //     }
        // }
        let temp1 = new Run();
        console.log(temp1);
    });
});

报错 TypeError: Cannot convert undefined or null to object, 这句引起的
如果我把export function logParameter的export 删除又可以正常执行

阅读 2.6k
2 个回答

放心吧。绝对不是导出导致的。应该是你的装饰器的错误。
为此。我还特地去试了。。

应该是你某个装饰器里面某个变量的错误。

clipboard.png

if (delete this[propertyName]) 应该是 if (delete target[propertyName])

没有 exportthis 是全局对象。

加上 export , typescript 编译的时候自动加了一个 'use strict' ,于是 this 没有了(undefined),于是 this[propertyName] 就报错了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进