首页 > 编程笔记 > 通用技能 阅读:1

ArkTS模块的用法(导入和导出)

程序可划分为多组编译单元或模块。每个模块都有其自己的作用域,即在模块中创建的任何声明(变量、函数、类等)在该模块之外都不可见,除非它们被显式导出。

与此相对,从另一个模块导出的变量、函数、类、接口等必须首先导入到模块中。

ArkTS模块的导出

可以使用关键字 export 导出顶层的声明。未导出的声明名称将被视为私有名称,且只能在声明该名称的模块中使用。

通过 export 方式导出顶层的声明,在导入时需要加“{}”:
export class Point {
  x: number = 0;
  y: number = 0;

  constructor(x: number, y: number) {
    this.x = x;
    this.y = y;
  }
}

// 原点
export let Origin = new Point(0, 0);

// 计算两点间欧氏距离
export function Distance(p1: Point, p2: Point): number {
  return Math.sqrt(
    (p2.x - p1.x) * (p2.x - p1.x) +
    (p2.y - p1.y) * (p2.y - p1.y)
  );
}

ArkTS模块的导入

1) 静态导入

导入声明用于导入从其他模块导出的实体,并在当前模块中提供其绑定。导入声明有两部分组成:
导入绑定有以下几种形式:
1) 假设模块具有路径“./utils”和导出实体“X”和“Y”;

2) 导入绑定 * as A 表示绑定名称“A”,通过 A.name 可访问从导入路径指定的模块导出的所有实体:
import * as Utils from './utils'
Utils.X // 表示来自Utils的X
Utils.Y // 表示来自Utils的Y

3) 导入绑定 { ident1, …, identN } 表示将导出的实体与指定名称绑定,该名称可以用作简单名称:
import { X, Y } from './utils'
X // 表示来自Utils的X
Y // 表示来自Utils的Y

4) 如果标识符列表定义了 ident as alias,则实体 ident 将绑定在名称 alias 下:
import { X as z, Y } from './utils';

z; // 表示来自 utils 的 X
Y; // 表示来自 utils 的 Y
X; // 编译时错误:'X' 不可见

2) 动态导入

在应用开发的一些场景中,如果希望根据条件导入模块或者按需导入模块,可以使用动态导入代替静态导入。

import() 语法通常称为动态导入 dynamic import,它是一种类似函数的表达式,用来动态导入模块。以这种方式调用,将返回一个 promise。代码如下:
let modulePath = prompt("which module to load?");
import(modulePath)
  .then(obj => /* <module object> */)
  .catch(err => /* <loading error, e.g. if no such module> */);

import(modulePath) 可以加载模块并返回一个 promise,该 promise resolve 为一个包含其所有导出的模块对象。该表达式可以在代码中的任意位置调用。如果在异步函数中使用 let module = await import(modulePath),代码如下:
export function hi() {
  console.log('Hello');
}

export function bye() {
  console.log('Bye');
}

那么,可以像下面这样进行动态导入:
async function test() {
  let ns = await import('./say');
  let hi = ns.hi;
  let bye = ns.bye;
  hi();   // 运行结果:控制台输出 Hello
  bye();  // 运行结果:控制台输出 Bye
}

相关文章