为什么`export default`导出具有`default`的对象而不是对象本身?

时间:2019-07-22 20:03:19

标签: javascript typescript

所以我有三个Typescript文件:

config / env / development.ts

import { Config } from '../config';

class DevConfig {
    public config : Config = {
        HOST: 'localhost',
        PORT: 8080
    };

    constructor() {
        this.config.HOST = 'localhost';
        this.config.PORT = (process.env.PORT as unknown as number) || 8080;
    }
}

export default new DevConfig().config;

config / index.ts

import { Config } from './config';

process.env.NODE_ENV = process.env.NODE_ENV || 'development';

class AppConfig {
    public allConfig : Config;
    public envConfig : Config;

    constructor() {
        this.envConfig = require(`${__dirname}/env/${process.env.NODE_ENV}.js`);
        this.allConfig = require(`${__dirname}/all.js`);
    }
}

export default new AppConfig().envConfig;

,另一个文件是: ./app.ts

import * as express from 'express';
import { hi } from './controllers/status';
import AppConfig from './config';

class App {
    public express: any;
    public config: object;

    constructor() {
        this.express = express();
        this.config = AppConfig;
        this.mountRoutes();

        console.log(`Output test: ${JSON.stringify(this.config, null, 4)}`);
    }

    private mountRoutes() {
        const router = express.Router();

        router.get('/', hi);
        this.express.use('/', router);
    }
}

export default new App();

运行此命令时看到的输出如下:

  

输出测试:{       “默认”:{           “ HOST”:“本地主机”,           “端口”:8080       }    }

“默认”来自哪里?如果我尝试做console.log(this.config.PORT);,则会得到undefined。有人可以澄清一下吗?

1 个答案:

答案 0 :(得分:1)

一个模块可以有一个default export 常规export,而require()只能返回一个。因此,您使用的编译器必须将多个导出转换为一个值。它通过将所有导出变成一个对象来实现。

  // this
  export default 1;
  export const named = 2;

  // turns into:
  module.exports = { 
    default: 1,
    named: 2 
  };

由于default是保留关键字,因此不能用作命名导出,因此,为default设置一个export default键是很有意义的。

您可以使用require("...").default轻松获得默认导出。