我正在尝试在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}}函数在无服务器框架中被称为某处,但我不知道实现细节。如果有人对框架有经验并且可以对此有所了解,我将不胜感激。
感谢阅读。
答案 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
的方法的定义。