ES6 * Typescript : Cannot find namespace

2019-07-06 21:30发布

问题:

Node7.4.0 / ES6 / Typescript 2.1.5 / WebStorm 2016.3

On the line : export default heroRoutes.router;

I get: TS2503 Cannot find namespace 'heroRoutes' after creating it and init() what could be wrong with it ?

thanks for feedback

HeroRouter.ts

import {Router, Request, Response, NextFunction} from 'express';
const Heroes = require('../data');

export class HeroRouter {
    router: Router;

    /**
     * Initialize the HeroRouter
     */
    constructor() {
        this.router = Router();
        this.init();
    }

    /**
     * GET all Heroes.
     */
    public  getAll(req: Request, res: Response, next: NextFunction) {
        res.send(Heroes);
    }

    /**
     * GET one hero by id
     */
    public getOne(req: Request, res: Response, next: NextFunction) {
        let query = parseInt(req.params.id);
        let hero = Heroes.find(hero => hero.id === query);
        if (hero) {
            res.status(200)
                .send({
                    message: 'Success',
                    status: res.status,
                    hero
                });
        }
        else {
            res.status(404)
                .send({
                    message: 'No hero found with the given id.',
                    status: res.status
                });
        }
    }

    /**
     * Take each handler, and attach to one of the Express.Router's
     * endpoints.
     */
    init() {
        this.router.get('/', this.getAll);
        this.router.get('/:id', this.getOne);
    }

}

// Create the HeroRouter, and export its configured Express.Router
let heroRoutes = new HeroRouter();
heroRoutes.init();

export default heroRoutes.router;

回答1:

const heroRouter = new HeroRouter();
const router = heroRouter.router;
export default router;

The reason for this is that you cannot export a qualified name. The exports of a module are bound to a special object known as the module namespace object. One reason is that if qualified exports were legal, the semantics would be surprising as updating the value of the instance member router of the variable heroRouter would not update the value of the exported binding (here named default).