【问题标题】:Typescript Member Function returning another Function打字稿成员函数返回另一个函数
【发布时间】:2018-04-16 06:00:45
【问题描述】:

我有课

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());

得到错误

错误 TS2683:“this”隐含类型为“any”,因为它没有 有一个类型注释。

我该如何解决这个错误?

【问题讨论】:

    标签: javascript typescript express


    【解决方案1】:

    Typescript(和 JavaScript)中的函数没有固定的this,所以this 是由调用者决定的。您返回的函数可以使用任何this 对象调用,因此编译器默认假定this 为any,如果您使用strict,则会导致错误:

    accessTokenMiddleWare.init().call({ newThis: true });
    

    如果你想从声明的上下文中捕获它,你应该使用一个箭头函数,将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

    【讨论】:

      猜你喜欢
      • 2012-02-23
      • 1970-01-01
      • 2022-01-12
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2023-01-24
      相关资源
      最近更新 更多