在Node.js TypeScript中扩展类时未定义的函数

问题描述

我想在打字稿中使用该函数访问类函数

这是我的课程BaseController :

   "use strict";

import { validationResult } from "express-validator";
import applyBind from 'auto-bind';

export class ValidationResult {
    haveError: boolean;
    errorMessage: string[];

    constructor(haveError: boolean,errorMessage: string[]) { }
}

export default class BaseCotnroller {

    constructor() {
        applyBind.bind(this);
    }

   static async ValidationAction(req,res): Promise<ValidationResult> {
        const result = await validationResult(req);
        if (!result.isEmpty()) {
            let errors = result.array();
            let message = [];
            errors.forEach((element) => {
                message.push(element.msg);
            });
            return new ValidationResult(true,message);
        }
        return new ValidationResult(false,null);
    }

}

然后扩展BaseController :

   import BaseCotnroller from './BaseController';


export default class PermissionController extends BaseCotnroller {

    constructor() {
        super();
    }

    /*** Create Permission ****/
    static async CreatePermission(req,res,next) {
            let validationData = await this.ValidationAction(req,res); 
            if (!validationData.haveError) {
                PermissionRepository.CreatePermission(req)
                    .then(() => {
                        this.Ok(res);
                    })
                    .catch((error) => {
                        return this.BadRerquest(res,error);
                    });
            } else {
                return this.BadRerquest(res,validationData.errorMessage);
            }   
    }


}

但是它告诉我这个错误

错误TypeError:无法读取未定义的属性“ ValidationAction” 在F:\ Projects \ Nodejs \ Travel Budy \ src \ http \ controller \ PermissionController.ts:20:45 在Generator.next() 在F:\ Projects \ Nodejs \ Travel Budy \ src \ http \ controller \ PermissionController.ts:8:71 在新的Promise() 在__awaiter(F:\ Projects \ Nodejs \ Travel Budy \ src \ http \ controller \ PermissionController.ts:4:12) 在CreatePermission(F:\ Projects \ Nodejs \ Travel Budy \ src \ http \ controller \ PermissionController.ts:24:16) 在Layer.handle上[作为handle_request](F:\ Projects \ Nodejs \ Travel Budy \ node_modules \ express \ lib \ router \ layer.js:95:5) 在下一个(F:\ Projects \ Nodejs \ Travel Budy \ node_modules \ express \ lib \ router \ route.js:137:13) 在Route.dispatch(F:\ Projects \ Nodejs \ Travel Budy \ node_modules \ express \ lib \ router \ route.js:112:3) 在Layer.handle上[作为handle_request](F:\ Projects \ Nodejs \ Travel Budy \ node_modules \ express \ lib \ router \ layer.js:95:5) 在F:\ Projects \ Nodejs \ Travel Budy \ node_modules \ express \ lib \ router \ index.js:281:22 在Function.process_params(F:\ Projects \ Nodejs \ Travel Budy \ node_modules \ express \ lib \ router \ index.js:335:12) 在下一个(F:\ Projects \ Nodejs \ Travel Budy \ node_modules \ express \ lib \ router \ index.js:275:10) 在Function.handle(F:\ Projects \ Nodejs \ Travel Budy \ node_modules \ express \ lib \ router \ index.js:174:3) 在路由器上(F:\ Projects \ Nodejs \ Travel Budy \ node_modules \ express \ lib \ router \ index.js:47:12) 在Layer.handle [作为handle_request](F:\ Projects \ Nodejs \ Travel Budy \ node_modules \ express \ lib \ router \ layer.js:95:5)

现在出了什么问题?我该如何解决这个问题?

解决方法

尝试在注册路由处理程序时将CreatePermission方法绑定到permission类:

router.post('/create',permission.CreatePermission.bind(permission));

或者,您可以将static方法更改为常规方法,创建PermissionController实例并将其用于路由处理:

import PermissionController from './../../http/controller/PermissionController';
const permission = new PermissionController()
const router = express.Router();  
router.post('/create',permission.CreatePermission)