ArkTS模块的用法(导入和导出)
程序可划分为多组编译单元或模块。每个模块都有其自己的作用域,即在模块中创建的任何声明(变量、函数、类等)在该模块之外都不可见,除非它们被显式导出。
与此相对,从另一个模块导出的变量、函数、类、接口等必须首先导入到模块中。
通过 export 方式导出顶层的声明,在导入时需要加“{}”:
导入绑定有以下几种形式:
1) 假设模块具有路径“./utils”和导出实体“X”和“Y”;
2) 导入绑定 * as A 表示绑定名称“A”,通过 A.name 可访问从导入路径指定的模块导出的所有实体:
3) 导入绑定 { ident1, …, identN } 表示将导出的实体与指定名称绑定,该名称可以用作简单名称:
4) 如果标识符列表定义了 ident as alias,则实体 ident 将绑定在名称 alias 下:
import() 语法通常称为动态导入 dynamic import,它是一种类似函数的表达式,用来动态导入模块。以这种方式调用,将返回一个 promise。代码如下:
import(modulePath) 可以加载模块并返回一个 promise,该 promise resolve 为一个包含其所有导出的模块对象。该表达式可以在代码中的任意位置调用。如果在异步函数中使用 let module = await import(modulePath),代码如下:
那么,可以像下面这样进行动态导入:
与此相对,从另一个模块导出的变量、函数、类、接口等必须首先导入到模块中。
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 }