散修带你入门鸿蒙应用开发基础第九节:模块的导入导出

ArkTS基础第九节:模块的导入导出

炼气九重天:高阶函数的工程化复用基础

【学习目标】

  1. 理解ArkTS“文件即模块”的核心规范,明确模块导入导出与高阶函数复用的关联;
  2. 掌握export的两类核心方式(命名导出/默认导出),将第八节的高阶函数拆分为独立工具模块;
  3. 掌握import的四类用法(命名导入/默认导入/批量导入/混合导入),灵活调用模块化的高阶函数;
  4. 吃透鸿蒙项目的模块路径规则,解决跨文件调用高阶函数的路径报错问题;
  5. 落地通用场景的高阶函数模块化实战,为后续接口、类的复用建立工程化基础。

【学习重点】

  1. 模块核心逻辑:文件独立隔离、导出对外暴露、导入实现复用,核心解决高阶函数的跨文件调用问题;
  2. 导出方式:命名导出(多高阶函数批量导出)、默认导出(核心高阶函数单独导出);
  3. 导入方式:按导出类型匹配导入语法,支持高阶函数的重命名和批量调用;
  4. 衔接要点:将第八节的高阶函数(如createAdder/数组map封装函数)拆分为模块,实现工程化复用;
  5. 避坑要点:鸿蒙相对路径规则、默认导出唯一性、高阶函数类型标注的模块化兼容。

【衔接提示】

第八节的高阶函数(如createAdder带步长累加器、filter+reduce筛选求和函数)若全部写在Index.ets,会导致主文件臃肿;通过模块化拆分到utils目录,可实现:

  1. 逻辑隔离:数组操作高阶函数→ArrayFuncUtil.ets,自定义高阶函数→CustomHOFUtil.ets
  2. 统一复用:数据统计、数值计算等通用场景,可直接导入工具模块的高阶函数;
  3. 便于维护:修改高阶函数逻辑时,仅需调整工具模块,无需改动所有调用文件。

一、模块的核心概念与高阶函数复用的关联

1.1 模块的基础定义

ArkTS遵循ES6模块规范,核心规则:

  • 独立性:一个.ets文件就是一个独立模块,模块内的高阶函数默认“私有”(仅当前文件可用);
  • 导出(export):将模块内的高阶函数“对外暴露”,允许其他文件调用;
  • 导入(import):从工具模块获取已导出的高阶函数,实现跨文件复用;
  • 核心价值:第八节的高阶函数(如通用累加器、数组筛选聚合函数)可封装为独立工具模块,在数据处理、数值计算等场景中随处调用,避免代码冗余。

1.2 高阶函数与模块化的衔接逻辑

第八节实现的高阶函数(如createAdder带步长累加器、filter+reduce筛选求和函数)若全部写在Index.ets,会导致主文件臃肿;通过模块化拆分到utils目录,可实现:

  1. 逻辑隔离:数组操作高阶函数→ArrayFuncUtil.ets,自定义高阶函数→CustomHOFUtil.ets
  2. 统一复用:数据统计、数值转换等通用场景,可直接导入工具模块的高阶函数;
  3. 便于维护:修改高阶函数逻辑时,仅需调整工具模块,无需改动所有调用文件。

二、模块导出(export)—— 高阶函数的对外暴露

基于第八节的高阶函数,重点掌握两种导出方式,实现工具模块的规范封装。

2.1 命名导出(多高阶函数批量导出)

适用于一个模块封装多个相关高阶函数(如数组操作的map/filter/reduce封装函数),支持批量对外暴露。

语法规则

// 方式1:声明时直接导出
export function 高阶函数名(参数): 返回值类型 { ... }

// 方式2:先声明后统一导出
function 高阶函数1() { ... }
function 高阶函数2() { ... }
export { 高阶函数1, 高阶函数2 /* 支持重命名:高阶函数2 as 新名称 */ };

实战1:数组高阶函数模块(复用第八节数组操作逻辑)

新建ets/utils/ArrayFuncUtil.ets,封装第八节的数组filter+reduce筛选聚合函数、map格式转换函数,通过命名导出对外暴露:

// ets/utils/ArrayFuncUtil.ets
/**
 * 复用第八节逻辑:筛选数组中符合条件的元素并求和(filter+reduce组合)
 * 命名导出:通用场景可用于筛选指定范围数字并求和
 * @param arr 待处理数字数组
 * @param condition 筛选条件(高阶函数参数)
 * @returns 符合条件元素的总和
 */
export function filterAndSum(arr: number[], condition: (num: number) => boolean): number {
  return arr.filter(condition).reduce((sum, curr) => sum + curr, 0);
}

/**
 * 复用第八节逻辑:数组映射转换(封装map)
 * 命名导出:通用场景可用于数据格式统一转换
 * @param arr 原始数组
 * @param mapper 映射逻辑(高阶函数参数)
 * @returns 转换后的新数组
 */
export function mapArray<T, U>(arr: T[], mapper: (item: T) => U): U[] {
  return arr.map(mapper);
}

/**
 * 新增:数组元素乘积计算(基于reduce的高阶函数)
 * 命名导出:通用场景可用于多数值累乘计算
 */
export function calcArrayProduct(arr: number[]): number {
  return arr.reduce((prod, curr) => prod * curr, 1);
}

2.2 默认导出(核心高阶函数单独导出)

适用于模块仅封装一个核心高阶函数(如第八节的createAdder累加器),导入时可自定义名称,简化调用。

语法规则

// 方式1:声明时直接默认导出
export default function 核心高阶函数名(参数): 返回值类型 { ... }

// 方式2:先声明后默认导出
function 核心高阶函数名() { ... }
export default 核心高阶函数名;

实战2:自定义高阶函数模块(复用第八节闭包累加器)

新建ets/utils/CustomHOFUtil.ets,将第八节的createAdder作为核心函数默认导出,同时命名导出辅助高阶函数:

// ets/utils/CustomHOFUtil.ets
/**
 * 复用第八节逻辑:带固定步长的累加器(高阶函数+闭包)
 * 默认导出:模块核心功能,通用场景可用于数值阶梯累加
 * @param step 累加步长
 * @returns 累加逻辑函数
 */
export default function createAdder(step: number): (num: number) => number {
  return (num: number) => num + step;
}

/**
 * 新增:带固定乘数的乘法器(高阶函数+闭包)
 * 命名导出:辅助高阶函数,通用场景可用于比例换算
 * @param factor 乘数(如0.8表示按80%换算)
 * @returns 乘法逻辑函数
 */
export function createMultiplier(factor: number): (num: number) => number {
  return (num: number) => num * factor;
}

三、模块导入(import)—— 高阶函数的跨文件调用

在鸿蒙页面文件ets/pages/Index.ets中,导入上述工具模块的高阶函数,结合通用场景实现复用,验证模块化的核心价值。

3.1 命名导入(对应命名导出的数组高阶函数)

语法与实战:数值筛选与转换

// ets/pages/Index.ets
// 命名导入ArrayFuncUtil中的高阶函数,支持重命名
import { filterAndSum, mapArray, calcArrayProduct as calcProduct } from '../utils/ArrayFuncUtil';

// 通用场景:学生成绩数组
const scores: number[] = [65, 78, 89, 92, 56, 85];

// 1. 调用filterAndSum:筛选成绩≥80的分数并求和(复用第八节filter+reduce逻辑)
const highScoreTotal = filterAndSum(scores, score => score >= 80);
console.log(`成绩≥80的总分:${highScoreTotal}`); // 输出:89+92+85=266

// 2. 调用mapArray:将数字成绩转换为等级字符串(复用第八节map逻辑)
const scoreLevels = mapArray(scores, score => {
  if (score >= 90) return "优秀";
  if (score >= 80) return "良好";
  if (score >= 60) return "及格";
  return "不及格";
});
console.log(`成绩等级列表:${scoreLevels}`); // 输出:及格,良好,良好,优秀,不及格,良好

// 3. 调用calcProduct(重命名后):计算指定数值的乘积
const nums = [2, 3, 5];
const numProduct = calcProduct(nums);
console.log(`数值乘积:${numProduct}`); // 输出:2*3*5=30

3.2 默认导入(对应默认导出的累加器高阶函数)

语法与实战:数值阶梯累加与比例换算

// 继续在Index.ets中添加
// 默认导入createAdder,自定义名称为createStepAdder
import createStepAdder from '../utils/CustomHOFUtil';
// 命名导入createMultiplier
import { createMultiplier } from '../utils/CustomHOFUtil';

// 1. 调用默认导入的累加器:创建步长为10的数值累加器(复用第八节闭包逻辑)
const add10 = createStepAdder(10);
console.log(`25+10 = ${add10(25)}`); // 输出:35
console.log(`48+10 = ${add10(48)}`); // 输出:58

// 2. 调用命名导入的乘法器:创建0.8的比例换算函数(通用核心场景)
const calc80Percent = createMultiplier(0.8);
console.log(`100按80%换算:${calc80Percent(100)}`); // 输出:80
console.log(`50按80%换算:${calc80Percent(50)}`); // 输出:40

3.3 混合导入(同时导入默认+命名高阶函数)

语法与实战:数值换算与累加

// 替换分散导入,一次导入CustomHOFUtil的所有内容
import createAdder, { createMultiplier } from '../utils/CustomHOFUtil';

// 通用场景:先比例换算再数值累加
const originNum = 100;
// 第一步:按70%换算
const convertedNum = createMultiplier(0.7)(originNum);
// 第二步:加20的基础值
const finalNum = createAdder(20)(convertedNum);
console.log(`最终数值:${finalNum}`); // 输出:100*0.7+20=90

3.4 批量导入(高阶函数模块的整体调用)

语法与实战:数组工具模块的批量调用

// 批量导入ArrayFuncUtil的所有高阶函数,挂载到ArrayUtil别名
import * as ArrayUtil from '../utils/ArrayFuncUtil';

// 调用批量导入的高阶函数
const testArr = [4, 6, 8, 10];
// 筛选偶数(此处testArr全为偶数)并求和
const evenTotal = ArrayUtil.filterAndSum(testArr, num => num % 2 === 0);
console.log(`偶数数组总和:${evenTotal}`); // 输出:4+6+8+10=28

四、鸿蒙模块路径规则(高阶函数导入避坑)

4.1 核心路径规范

  1. 相对路径:最常用,基于当前文件位置定位模块,支持./(当前目录)、../(上级目录);
    • 示例:Index.etspages目录,导入utils目录的模块→../utils/ArrayFuncUtil
  2. 路径省略.ets/.ts后缀可省略,目录下的index.ets可直接写目录名;
  3. 绝对路径:鸿蒙不推荐,易因工程结构变更导致报错。

4.2 常见路径错误与解决方案

错误场景 报错原因 解决方案
找不到模块utils/ArrayFuncUtil 未加../,路径层级错误 改为../utils/ArrayFuncUtil
模块导出与导入不匹配 默认导出用命名导入语法 对应导出方式使用正确的导入语法
高阶函数类型不匹配 模块函数类型标注缺失 为模块内高阶函数添加完整类型标注

五、高阶函数模块化的通用综合实战

实战场景:学生成绩统计全流程

整合第八节的高阶函数与第九节的模块化,实现“成绩筛选→等级转换→总分计算→比例换算”的完整逻辑:

// ets/pages/Index.ets
import { filterAndSum, mapArray } from '../utils/ArrayFuncUtil';
import createAdder, { createMultiplier } from '../utils/CustomHOFUtil';

// 学生成绩数据
interface StudentScore {
  name: string;
  score: number;
  isQualified: boolean; // 是否合格
}
const studentList: StudentScore[] = [
  { name: "张三", score: 85, isQualified: true },
  { name: "李四", score: 55, isQualified: false },
  { name: "王五", score: 92, isQualified: true }
];

// 1. 提取合格学生的成绩(复用mapArray高阶函数)
const qualifiedScores = mapArray(studentList, item => item.isQualified ? item.score : 0);

// 2. 计算合格学生的成绩总和(复用filterAndSum高阶函数)
const qualifiedTotal = filterAndSum(qualifiedScores, score => score > 0);
console.log(`合格学生成绩总和:${qualifiedTotal}`); // 输出:85+92=177

// 3. 计算成绩的平均比例(复用createMultiplier高阶函数)
const avgRate = createMultiplier(1 / studentList.length);
const avgScore = avgRate(qualifiedTotal);
console.log(`合格学生平均成绩:${avgScore.toFixed(1)}`); // 输出:177/3≈59.0

// 4. 叠加基础加分(复用createAdder高阶函数,步长为5实现加分)
const addBonus = createAdder(5);
const finalAvgScore = addBonus(avgScore);
console.log(`加分后平均成绩:${finalAvgScore.toFixed(1)}`); // 输出:59.0+5=64.0

六、课堂小结

  1. 核心关联:模块导入导出是第八节高阶函数实现工程化复用的关键,解决了高阶函数的跨文件调用问题;
  2. 导出逻辑:命名导出适配多高阶函数批量暴露,默认导出适配核心高阶函数的简化调用;
  3. 导入技巧:按导出类型匹配导入语法,支持重命名和批量调用,通用场景可灵活组合高阶函数;
  4. 路径规则:鸿蒙需严格遵循相对路径,避免因层级错误导致高阶函数导入失败;
  5. 实战价值:模块化的高阶函数可在数据统计、数值计算等通用场景中统一复用,提升代码复用性和可维护性。

七、代码仓库

工程名称:HigherOrderFuncDemo_1
本节代码已同步至:https://gitee.com/juhetianxia321/harmony-os-code-base.git

八、课后练习

  1. 基础题:将第八节课后练习的createMultiplier函数,通过默认导出封装为独立模块,并在主文件导入调用;
  2. 进阶题:封装通用场景的“数值区间筛选+等级转换”高阶函数(filter+map),命名导出到ArrayFuncUtil,并在主文件导入实现“筛选100-200之间的数值并转换为对应区间标签(如100-150→'区间A',151-200→'区间B')”;
  3. 综合题:基于模块化的高阶函数,实现通用数据的“数值统计(求和/乘积)→比例换算(0.9倍)→基础累加(步长10)”全链路逻辑。

九、下节预告

下一节将进入第十节:接口(interface)的核心约束与契约设计,重点学习:

  1. 接口的核心定义,理解其与高阶函数、模块化的关联(如约束高阶函数的参数类型);
  2. 接口的属性/方法约束语法,为通用数据(成绩/数值)建立类型契约;
  3. 接口与高阶函数的结合,实现类型安全的逻辑注入;
  4. 通用场景的接口实战(如IScore/INumberData接口定义),为后续类的封装奠定类型基础。

十、鸿蒙开发者学习与认证指引

(一)、官方学习班级报名(免费)

  1. 班级链接HarmonyOS赋能资源丰富度建设(第四期)
  2. 学号填写规则:填写个人手机号码即可完成班级信息登记

(二)、HarmonyOS应用开发者认证考试(免费)

  1. 考试链接HarmonyOS开发者能力认证入口

  2. 认证等级及适配人群

    • 基础认证:适配软件工程师、移动应用开发人员,需掌握HarmonyOS基础概念、DevEco Studio基础使用、ArkTS及ArkUI基础开发等能力;
    • 高级认证:适配项目经理、工程架构师,需掌握系统核心技术理念、应用架构设计、关键技术开发及应用上架运维等能力;
    • 专家认证:适配研发经理、解决方案专家,需掌握分布式技术原理、端云一体化开发、跨端迁移及性能优化等高级能力。
  3. 认证权益:通过认证可获得电子版证书以及其他专属权益。

posted @ 2025-12-12 17:15  鸿蒙-散修  阅读(0)  评论(0)    收藏  举报