javascript - Typescript 成员函数返回另一个函数

标签 javascript typescript express

我有课

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/

相关文章:

javascript - (Angular2) JSON数据(http.get())未定义,数据未在组件中更新

javascript - 为页面上的链接查询 MediaWiki API 不会返回所有链接

typescript - 在 typescript 文件上启用 Eslint

typescript - 如何从子对象中获取预定义属性?

node.js - 提交两次相同请求时 HTTP header 出错

javascript - React/Redux 传递状态变化 <Picker>

javascript - 在单独的对象中查找匹配值

css - 在 Angular 2 应用程序中跨组件共享样式

javascript - 使用 MomentJS 的 Javascript 中的无效日期

javascript - 无法获取哈希密码以使用 bcrypt 保存