TypeScript和无服务器:从公共方法调用私有方法时,`this`未定义

时间:2018-02-02 22:43:29

标签: javascript typescript webpack serverless-framework

我正在尝试在TypeScript中构建AWS无服务器(https://serverless.com/)函数。

具体来说,我使用一个调用一些私有方法的公共方法来定义一个抽象类。

这是我简化的TypeScript类:

export abstract class AbstractPayloadProcessor {

    private preHandlePayload(payload) {
        console.log('arrived in prehandle method')
    }

    private postHandlePayload(payload) {
        console.log('arrived in posthandle method')
    }

    protected handleException(error) {
        console.log('Exception has occurred:', error)
    }

    public processPayload(event) {

        // this is the problematic line
        this.preHandlePayload(event.payload)
        .
        .
        .
    }
}

我使用webpack将其转换为ES5,它产生以下JavaScript:

var AbstractPayloadProcessor = /** @class */ (function () {
    AbstractPayloadProcessor.prototype.preHandlePayload = function (payload) {
        console.log('arrived in prehandle method');
    };
    AbstractPayloadProcessor.prototype.postHandlePayload = function (payload) {
        console.log('arrived in posthandle method');
    };
    AbstractPayloadProcessor.prototype.handleException = function (error) {
        console.log('Exception has occurred:', error);
    };
    AbstractPayloadProcessor.prototype.processPayload = function (event) {
        // this line throws the exception
        this.preHandlePayload(event.payload);
        .
        .
        .
}());

确切的例外是:

TypeError: Cannot read property 'preHandlePayload' of undefined

到目前为止,我已经尝试将webpack配置设置为使用ES6,并尝试使用箭头函数来声明typescript中的函数。两者都产生相同的例外。

{* 1}}函数在无服务器框架中被称为某处,但我不知道实现细节。如果有人对框架有经验并且可以对此有所了解,我将不胜感激。

感谢阅读。

1 个答案:

答案 0 :(得分:0)

疯狂猜测

我猜你正在做的是使用someObject.processPayload并将其作为回调函数传递给某个函数,或者将其作为事件处理程序保存在某处。这个函数反过来调用this.preHandlePayload(),但它不能,因为没有被正确调用它的this未定义。

更多信息

在方法中可能导致this未定义的可能性很少,如果它是私有的或公开的,那么它并不重要 - 因为你可以看到所有这些东西最终都是公共的transpilation。

一种可能的方法是,例如在method1内,如果您拨打method2()而不是this.method2(),则this中的method2未定义。

另一个常见错误是将方法保存为事件处理程序或将其用作回调,例如:

x.onSomething = object.method;

functionThatTakesCallback(object.method);

对于那些工作的情况,你需要传递一个匿名函数,如:

x.onSomething = (...args) => object.method(...args);

或将方法绑定到该对象:

x.onSomething = object.method.bind(object);

当然,很难说出你的案例中究竟出现了什么问题,因为你没有告诉我们你如何调用你的方法,这就是调用而不是通常将undefined放入this的方法的定义