模块
原创大约 2 分钟
类似于Java中的包
,ArkTS也有自己组织代码的方式,那就是模块
。
导出模块
每个模块都有自己的作用域,在模块中创建的任何实体(变量、函数、类等)在该模块之外都不可见,除非它们被显式导出。
export
export
用于导出在模块中创建的实体,所有未使用export
导出的实体都是为私有实体,只能在创建该实体的模块中使用。
// 文件:point.ts
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));
}
export let x = 1;
export let y = "lixingyun";
export default
在一个文件中,import
和export
可以有多个,但export default
只能有一个。
通过export
方式导出的内容,在使用import
导入时需要加花括号{}
,而export default
则不需要。
// 文件:test1.ts
// export可以有多个
export const t1 = "CONST";
export function log(str) {
return str;
}
const t2 = "ARKTS";
// export default只能有一个
export default t2;
而且,使用export default
导出的内容可以不需要指定标识符(也就是变量)名称。
// 文件:test2.ts
import any1 from "./test1";
import any2 from "./test1";
// test1.ts中的export default输出了一个称为default的变量
// 这个default变量可以为它取任意的名字且不需要花括号`{}`
// 输出的都是"ARKTS"
console.log(any1);
console.log(any2);
导入模块
import
用于导入从其它模块导出的实体。
静态导入
// 第一种方式:把所有导入的对象放到Point命名空间下
import * as Point from './point'
// 表示来自Point的x
Point.x
// 第二种方式
import {x, y} from './point'
// 表示来自point的x
x
// 第三种方式:为已有标识符重命名
import {x as z, y} from './point'
// 表示来自point的x
z
// 表示来自point的y
y
// 编译错误
x
// 使用export导出的,在导入时需要花括号`{}`
import {t1, log} from './test1';
// 使用export default导出的,在导入时不需要花括号`{}`
import t2 from './test1'
动态导入
如果需要根据条件导入或者按需导入模块,就可以使用import()
语法实现动态导入。
async function loadModule(moduleName: string) {
const module = await import(`./${moduleName}`);
return module;
}
loadModule('myModule').then((module) => {
// 当模块加载完成后,可以在这里使用它
module.doSomething();
}).catch((error) => {
console.error('Failed to load module:', error);
});
感谢支持
更多内容,请移步《超级个体》。