Harmony os——ArkTS 语言笔记(六):模块、导入导出与 `this` 关键字

Harmony os------ArkTS 语言笔记(六):模块、导入导出与 this 关键字

鸿蒙第四期活动

这一篇主要整理这几块内容:

  • 模块与导出 / 导入
  • 动态 import()(按需加载)
  • HarmonyOS SDK / Kit 的导入方式
  • 顶层语句 & this 关键字的使用限制

还是老规矩:尽量写成"自己也会翻回来看的那种笔记",而不是翻译文档。


一、模块:ArkTS 程序的"分文件"方式

在 ArkTS 里,可以把程序拆成多个模块(编译单元)。每个模块:

  • 自己的作用域
  • 模块内部定义的变量、函数、类等默认只在本模块可见
  • 想给外面用,必须显式 export
  • 想用别的模块的东西,就要 import

这个设计其实很自然:

默认"封闭",要共享就自己说一声。


二、导出:exportexport 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 导出了 XY

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 作为类型(即 this type);
  • ❌ 不支持在普通函数 中使用 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 当前规则下,可以简化成两点:

  1. this 只出现在类的实例方法中
  2. 它指向:
    • 调用实例方法的对象
    • 在构造函数中,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
    • 指向调用方法的实例或正在构造的对象。
相关推荐
Zeku43 分钟前
20251125 - 韦东山Linux第三篇笔记【上】
linux·笔记·单片机
Brianna Home1 小时前
[鸿蒙2025领航者闯关] 鸿蒙 6.0 星盾安全架构 + AI 防窥:金融级支付安全实战与深度踩坑实录
人工智能·安全·harmonyos·安全架构
灰灰勇闯IT1 小时前
隐语MOOC三期学习感悟:解锁数据要素流通的“三维认知”与落地逻辑
笔记·学习
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [block][mq-deadline]
linux·笔记·学习
Dolphin_Home2 小时前
Spring 事务避坑笔记:从入门到解决自调用陷阱
数据库·笔记·spring
('-')2 小时前
《从根上理解MySQL是怎样运行的》第二十二章学习笔记
笔记·学习·mysql
bestadc2 小时前
鸿蒙应用开发的MVVM(Model-View-ViewModel)模式
华为·harmonyos
言言的底层世界3 小时前
c++中STL容器及算法等
开发语言·c++·经验分享·笔记
光头程序员3 小时前
vue学习笔记
vue.js·笔记·学习