关于导出和导入

我们常用的导出有两种写法。

export 变量

  1. // js 写法
  2. function alert() {
  3. }
  4. exports.alert = alert;
  5. exports.config = { a: 1 };
  1. // ts 写法
  2. export function alert() {
  3. }
  4. export const config = { a: 1 };

export 关键字即可。

默认导出

在以前我们很习惯 module.exports 来将整个对象进行导出,而切换到 ts 之后,请尽量不要使用这种做法。

  1. // js 写法
  2. module.exports = {
  3. a: 1
  4. };
  5. module.exports = () => {
  6. console.log(111);
  7. }
  1. // ts 写法
  2. export = {
  3. a: 1
  4. };
  5. export = () => {
  6. console.log(111);
  7. }

注意

两种写法无法并存,请尽量使用 export 进行导出。

default 导出

在很多时候,在代码中会有做 default 导出的支持,比如在 egg-core 中的加载部分:

  1. // require js module
  2. const obj = require(filepath);
  3. if (!obj) return obj;
  4. // it's es module
  5. if (obj.__esModule) return 'default' in obj ? obj.default : obj;

这个时候我们将代码写成如下也是可以支持的。

  1. export default {
  2. }

编译成 js,则会变成

  1. Object.defineProperty(exports, "__esModule", { value: true });
  2. exports.default = {
  3. }

一般导入

一般情况下,我们在 js 上会使用 require 关键字进行导入,而在 ts 语法下,这样导入会丢失类型,所以在 ts 下写法有所不同。

  1. // js 写法
  2. const applicatoin = require('midway').application;
  3. const {applicatoin} = require('midway');
  1. // ts 写法
  2. import { applicatoin } from 'midway';

这样写,midway 包中的类型定义才可以被正常解析。

注意

只有使用 export 进行导出的属性才能被 import,不然就需要换一种写法。

默认导入

有时候,三方包或者内置模块是通过 module.exports 出来的。

  1. // js 写法
  2. const path = require('path');

这个时候可以使用 * 做全部导出。

  1. // ts 写法
  2. import * as path from 'path';