我有课
import {Request, Response, Router} from 'express';
import {IAccessTokenMiddleWare} from "./IAccessTokenMiddleWare";
class AccessTokenMiddleWare implements IAccessTokenMiddleWare {
private jwtToken: string;
constructor() {
this.jwtToken = "";
}
public init() : any {
return function (req: Request, res: Response, next: any) {
this.addJwtToReqBody(req);
}
}
private addJwtToReqBody(req) {
console.log("ADDED...")
}
}
export {AccessTokenMiddleWare}
我像下面这样调用它
var accessTokenMiddleWare = new AccessTokenMiddleWare();
router.use(accessTokenMiddleWare.init());
获取错误
error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation.
我该如何解决这个错误?
最佳答案
Typescript(和 JavaScript)中的函数没有固定的 this
,因此 this
由调用者决定。您返回的函数可以用任何 this
对象调用,因此编译器假定 this
默认为 any,如果您使用 strict< 会导致错误
:
accessTokenMiddleWare.init().call({ newThis: true });
如果你想从声明的上下文中捕获 this,你应该使用一个箭头函数,它将 this
作为当前类:
class AccessTokenMiddleWare implements IAccessTokenMiddleWare {
private jwtToken: string;
constructor() {
this.jwtToken = "";
}
public init() {
return (req: Request, res: Response, next: any) => {
this.addJwtToReqBody(req);
}
}
private addJwtToReqBody(req: Request) {
console.log("ADDED...")
}
}
注意 我还从 init
中删除了类型注释,您可以让编译器推断返回将是一个函数并获得更好的类型检查。您也可以手动指定它:init(): (req: Request, res: Response, next: any) => void
关于javascript - Typescript 成员函数返回另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49850483/