在 TypeScript 和 ES6 中,exportexport default 是用来导出模块成员的两种不同方式。理解它们的区别对于模块化编程非常重要。以下是详细的解释:

export

export 关键字用于导出模块中的多个成员(如变量、函数、类、接口等)。使用 export 导出的成员在导入时需要使用与导出时相同的名称,或使用 as 关键字重命名。

示例

  1. // math.ts
  2. export const PI = 3.14;
  3. export function add(a: number, b: number): number {
  4. return a + b;
  5. }
  6. export class Calculator {
  7. multiply(a: number, b: number): number {
  8. return a * b;
  9. }
  10. }
  11. // app.ts
  12. import { PI, add, Calculator } from './math';
  13. console.log(PI); // 3.14
  14. console.log(add(2, 3)); // 5
  15. const calc = new Calculator();
  16. console.log(calc.multiply(2, 3)); // 6

使用 as 重命名

  1. // app.ts
  2. import { PI as PiValue, add as sum, Calculator } from './math';
  3. console.log(PiValue); // 3.14
  4. console.log(sum(2, 3)); // 5

export default

export default 用于导出模块中的单个默认成员。每个模块只能有一个默认导出。使用 export default 导出的成员在导入时可以使用任意名称,不需要与导出时的名称相同。

示例

  1. // logger.ts
  2. export default function log(message: string): void {
  3. console.log(message);
  4. }
  5. // app.ts
  6. import log from './logger';
  7. log('This is a default export log message.');

与命名导出的组合

你可以在同一个模块中同时使用 export defaultexport 来导出默认成员和命名成员。

  1. // utils.ts
  2. export default function log(message: string): void {
  3. console.log(message);
  4. }
  5. export const PI = 3.14;
  6. export function add(a: number, b: number): number {
  7. return a + b;
  8. }
  9. // app.ts
  10. import log, { PI, add } from './utils';
  11. log('This is a default export log message.');
  12. console.log(PI); // 3.14
  13. console.log(add(2, 3)); // 5

区别总结

  1. 数量限制

    • export:可以导出多个成员。
    • export default:每个模块只能有一个默认导出。
  2. 导入方式

    • export:导入时需要使用花括号 {} 并且名称需要匹配,或使用 as 重命名。
    • export default:导入时不需要花括号,可以使用任意名称。
  3. 使用场景

    • export:适用于导出多个命名成员的情况。
    • export default:适用于导出单个主成员或模块的核心成员的情况。

例子对比

使用 export 导出多个成员

  1. // math.ts
  2. export const PI = 3.14;
  3. export function add(a: number, b: number): number {
  4. return a + b;
  5. }
  6. // app.ts
  7. import { PI, add } from './math';
  8. console.log(PI); // 3.14
  9. console.log(add(2, 3)); // 5

使用 export default 导出单个主成员

  1. // logger.ts
  2. export default function log(message: string): void {
  3. console.log(message);
  4. }
  5. // app.ts
  6. import log from './logger';
  7. log('This is a default export log message.');

组合使用

  1. // utils.ts
  2. export default function log(message: string): void {
  3. console.log(message);
  4. }
  5. export const PI = 3.14;
  6. export function add(a: number, b: number): number {
  7. return a + b;
  8. }
  9. // app.ts
  10. import log, { PI, add } from './utils';
  11. log('This is a default export log message.');
  12. console.log(PI); // 3.14
  13. console.log(add(2, 3)); // 5