Harmony os------ArkTS 语言笔记(六):模块、导入导出与 this 关键字
这一篇主要整理这几块内容:
- 模块与导出 / 导入
- 动态
import()(按需加载)- HarmonyOS SDK / Kit 的导入方式
- 顶层语句 &
this关键字的使用限制还是老规矩:尽量写成"自己也会翻回来看的那种笔记",而不是翻译文档。
一、模块:ArkTS 程序的"分文件"方式
在 ArkTS 里,可以把程序拆成多个模块(编译单元)。每个模块:
- 有 自己的作用域;
- 模块内部定义的变量、函数、类等默认只在本模块可见;
- 想给外面用,必须显式
export; - 想用别的模块的东西,就要
import。
这个设计其实很自然:
默认"封闭",要共享就自己说一声。
二、导出:export 和 export default
2.1 普通导出
可以用 export 把顶层声明导出去:
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 的东西,就只在当前模块内部可见,相当于模块级别的"私有"。
2.2 默认导出:export default
有时候一个模块"主角"只有一个,可以用 export default:
class Demo {
constructor() {
// ...
}
}
export default new Demo();
对应的导入语法会稍微不一样(下面会讲)。
三、导入:静态导入的几种写法
假设有个模块 ./utils 导出了 X 和 Y。
3.1 import * as 命名空间
import * as Utils from './utils';
Utils.X; // 来自 utils 的 X
Utils.Y; // 来自 utils 的 Y
这种写法适合"模块内导出内容比较多,我希望有个前缀"的场景。
3.2 解构式导入 { X, Y }
import { X, Y } from './utils';
X; // 直接用
Y;
这种更常见,简洁、直观。
3.3 起别名:as
import { X as Z, Y } from './utils';
Z; // 实际上是 utils 里的 X
Y;
X; // ❌ 编译错误:X 在当前模块不可见
一般在命名冲突或者想让名字更语义化时用 as。
3.4 关于 export default 的导入(顺带一提)
虽然你给的片段没写导入默认导出的形式,但常规用法类似 TS/ES:
import DemoInstance from './Demo';
// 对应:export default new Demo();
四、动态导入:import() 表达式
静态 import 是编译时确定 依赖关系的;
动态 import() 则可以做到:按需加载 / 条件加载。
特点:
- 语法是一个表达式:
import(modulePath); - 返回一个
Promise,resolve 出模块对象; - 可以写在代码中的任何地方。
4.1 基本示例:then 写法
// Calc.ts
export function add(a: number, b: number): number {
let c = a + b;
console.info('Dynamic import, %d + %d = %d', a, b, c);
return c;
}
// Index.ets
import('./Calc').then((obj: ESObject) => {
console.info(obj.add(3, 5));
}).catch((err: Error) => {
console.error('Module dynamic import error: ', err);
});
注意:
obj就是模块命名空间对象;- 里面包含了
Calc.ts导出的所有实体,比如obj.add。
4.2 在 async 函数里配合 await
// say.ts
export function hi() {
console.info('Hello');
}
export function bye() {
console.info('Bye');
}
async function test() {
let ns = await import('./say');
let hi = ns.hi;
let bye = ns.bye;
hi();
bye();
}
这种写法比 .then() 更直观一些,逻辑顺序更接近日常思维。
动态导入典型用途:
- 某段逻辑只在特定条件下需要;
- 大模块拆分,降低首屏加载压力;
- 插件系统、按需注册某些功能。
五、导入 HarmonyOS SDK 开放能力 & Kit
HarmonyOS SDK 提供的各种系统能力,本质上也是通过 模块导入 使用的。
5.1 直接导入接口模块
最基础的方式,比如导入 UIAbility:
import UIAbility from '@ohos.app.ability.UIAbility';
5.2 引入 Kit 概念(三种用法)
从 HarmonyOS NEXT Developer Preview 1 开始,有了 Kit 的概念------可以把某些相关模块打包在一起,推荐通过 Kit 来使用能力。
以 @kit.AbilityKit 为例,三种方式:
方式一:导入 Kit 下单个模块
import { UIAbility } from '@kit.AbilityKit';
方式二:导入 Kit 下多个模块
import { UIAbility, Ability, Context } from '@kit.AbilityKit';
方式三:导入 Kit 下所有模块(不太推荐)
import * as module from '@kit.AbilityKit';
// 之后通过 module.UIAbility / module.Context 等方式使用
说明一下:
方式三会导入整个 Kit 下所有模块,虽然写起来爽,但可能把很多没用到的东西也打进 HAP 包里 → 包体变大,资源浪费 。
实战中建议 优先使用方式一或方式二,按需导入。
六、顶层语句:写在模块最外层的代码
顶层语句就是不在任何函数、类、块作用域里面的那些代码,比如:
- 顶层变量声明
- 顶层函数声明
- 顶层表达式(如立即执行的逻辑)
作用:
- 常用来做模块初始化;
- 导出类型 / 工具函数;
- 注册某些全局行为(比如日志、配置等)。
在 ArkTS 的模块化设计里,每个文件就是一个模块,顶层作用域就是这个模块的作用域。
七、this 关键字:ArkTS 的使用限制
这一部分有点不一样:ArkTS 对 this 的使用是严格限制的。
7.1 支持的用法:只能在"类的实例方法中"
合法用法示例:
class A {
count: string = 'a';
m(i: string): void {
this.count = i; // ✅ 合法
}
}
这里 this 指向的是:调用这个实例方法的对象。
比如:
let a = new A();
a.m('b'); // this 指向 a 实例
7.2 不支持的用法
ArkTS 限制比较狠:
- ❌ 不支持
this作为类型(即thistype); - ❌ 不支持在普通函数 中使用
this; - ❌ 不支持在静态方法 里用
this访问实例成员。
看几个例子:
class A {
n: number = 0;
f1(arg1: this) {}
// ❌ 编译错误:不支持 this 类型
static f2(arg1: number) {
this.n = arg1;
// ❌ 编译错误:静态方法中不支持这样用 this
}
}
function foo(arg1: number) {
this.n = arg1;
// ❌ 编译错误:普通函数中也不能用 this
}
可以看到,ArkTS 并没有像 TypeScript 那样开放的 this 用法,而是刻意收紧,避免"this 指向不明"的各种坑。
7.3 this 的指向总结
在 ArkTS 当前规则下,可以简化成两点:
this只出现在类的实例方法中;- 它指向:
- 调用实例方法的对象;
- 在构造函数中,
this指向正在构造的对象实例。
静态方法里,推荐完全不用 this,改用类名访问静态成员:
class Counter {
static total: number = 0;
static increase() {
Counter.total++; // ✅ 用类名
}
}
小结:这一篇的关键词
本篇主要覆盖了这些内容:
- 模块 & 作用域
- 每个文件是一个模块;
export/export default用于导出;- 未导出内容仅在本模块可见。
- 导入方式
import * as ns from '...'import { X, Y } from '...'import { X as Alias } from '...'- 动态导入
import('...')返回Promise,可以配合await。
- HarmonyOS SDK / Kit 导入
- 直接导入模块:
import UIAbility from '@ohos.app.ability.UIAbility'; - 通过 Kit 使用能力(推荐方式一 & 二)。
- 直接导入模块:
- 顶层语句
- 写在模块最外层,用于初始化、导出函数/类等。
this关键字- 只能在类的实例方法中使用;
- 不支持
this类型; - 不支持在静态方法和普通函数中使用
this; - 指向调用方法的实例或正在构造的对象。