关于导出和导入
我们常用的导出有两种写法。
export 变量
// js 写法
function alert() {
}
exports.alert = alert;
exports.config = { a: 1 };
// ts 写法
export function alert() {
}
export const config = { a: 1 };
用 export
关键字即可。
默认导出
在以前我们很习惯 module.exports
来将整个对象进行导出,而切换到 ts 之后,请尽量不要使用这种做法。
// js 写法
module.exports = {
a: 1
};
module.exports = () => {
console.log(111);
}
// ts 写法
export = {
a: 1
};
export = () => {
console.log(111);
}
注意
两种写法无法并存,请尽量使用 export
进行导出。
default 导出
在很多时候,在代码中会有做 default 导出的支持
,比如在 egg-core
中的加载部分:
// require js module
const obj = require(filepath);
if (!obj) return obj;
// it's es module
if (obj.__esModule) return 'default' in obj ? obj.default : obj;
这个时候我们将代码写成如下也是可以支持的。
export default {
}
编译成 js,则会变成
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = {
}
一般导入
一般情况下,我们在 js 上会使用 require
关键字进行导入,而在 ts 语法下,这样导入会丢失类型,所以在 ts 下写法有所不同。
// js 写法
const applicatoin = require('midway').application;
const {applicatoin} = require('midway');
// ts 写法
import { applicatoin } from 'midway';
这样写,midway
包中的类型定义才可以被正常解析。
注意
只有使用 export
进行导出的属性才能被 import
,不然就需要换一种写法。
默认导入
有时候,三方包或者内置模块是通过 module.exports
出来的。
// js 写法
const path = require('path');
这个时候可以使用 *
做全部导出。
// ts 写法
import * as path from 'path';