散修带你入门鸿蒙应用开发基础第九节:模块的导入导出
ArkTS基础第九节:模块的导入导出
炼气九重天:高阶函数的工程化复用基础
【学习目标】
- 理解ArkTS“文件即模块”的核心规范,明确模块导入导出与高阶函数复用的关联;
- 掌握
export的两类核心方式(命名导出/默认导出),将第八节的高阶函数拆分为独立工具模块; - 掌握
import的四类用法(命名导入/默认导入/批量导入/混合导入),灵活调用模块化的高阶函数; - 吃透鸿蒙项目的模块路径规则,解决跨文件调用高阶函数的路径报错问题;
- 落地通用场景的高阶函数模块化实战,为后续接口、类的复用建立工程化基础。
【学习重点】
- 模块核心逻辑:文件独立隔离、导出对外暴露、导入实现复用,核心解决高阶函数的跨文件调用问题;
- 导出方式:命名导出(多高阶函数批量导出)、默认导出(核心高阶函数单独导出);
- 导入方式:按导出类型匹配导入语法,支持高阶函数的重命名和批量调用;
- 衔接要点:将第八节的高阶函数(如
createAdder/数组map封装函数)拆分为模块,实现工程化复用; - 避坑要点:鸿蒙相对路径规则、默认导出唯一性、高阶函数类型标注的模块化兼容。
【衔接提示】
第八节的高阶函数(如createAdder带步长累加器、filter+reduce筛选求和函数)若全部写在Index.ets,会导致主文件臃肿;通过模块化拆分到utils目录,可实现:
- 逻辑隔离:数组操作高阶函数→
ArrayFuncUtil.ets,自定义高阶函数→CustomHOFUtil.ets; - 统一复用:数据统计、数值计算等通用场景,可直接导入工具模块的高阶函数;
- 便于维护:修改高阶函数逻辑时,仅需调整工具模块,无需改动所有调用文件。
一、模块的核心概念与高阶函数复用的关联
1.1 模块的基础定义
ArkTS遵循ES6模块规范,核心规则:
- 独立性:一个
.ets文件就是一个独立模块,模块内的高阶函数默认“私有”(仅当前文件可用); - 导出(export):将模块内的高阶函数“对外暴露”,允许其他文件调用;
- 导入(import):从工具模块获取已导出的高阶函数,实现跨文件复用;
- 核心价值:第八节的高阶函数(如通用累加器、数组筛选聚合函数)可封装为独立工具模块,在数据处理、数值计算等场景中随处调用,避免代码冗余。
1.2 高阶函数与模块化的衔接逻辑
第八节实现的高阶函数(如createAdder带步长累加器、filter+reduce筛选求和函数)若全部写在Index.ets,会导致主文件臃肿;通过模块化拆分到utils目录,可实现:
- 逻辑隔离:数组操作高阶函数→
ArrayFuncUtil.ets,自定义高阶函数→CustomHOFUtil.ets; - 统一复用:数据统计、数值转换等通用场景,可直接导入工具模块的高阶函数;
- 便于维护:修改高阶函数逻辑时,仅需调整工具模块,无需改动所有调用文件。
二、模块导出(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 核心路径规范
- 相对路径:最常用,基于当前文件位置定位模块,支持
./(当前目录)、../(上级目录);- 示例:
Index.ets在pages目录,导入utils目录的模块→../utils/ArrayFuncUtil;
- 示例:
- 路径省略:
.ets/.ts后缀可省略,目录下的index.ets可直接写目录名; - 绝对路径:鸿蒙不推荐,易因工程结构变更导致报错。
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
六、课堂小结
- 核心关联:模块导入导出是第八节高阶函数实现工程化复用的关键,解决了高阶函数的跨文件调用问题;
- 导出逻辑:命名导出适配多高阶函数批量暴露,默认导出适配核心高阶函数的简化调用;
- 导入技巧:按导出类型匹配导入语法,支持重命名和批量调用,通用场景可灵活组合高阶函数;
- 路径规则:鸿蒙需严格遵循相对路径,避免因层级错误导致高阶函数导入失败;
- 实战价值:模块化的高阶函数可在数据统计、数值计算等通用场景中统一复用,提升代码复用性和可维护性。
七、代码仓库
工程名称:HigherOrderFuncDemo_1
本节代码已同步至:https://gitee.com/juhetianxia321/harmony-os-code-base.git
八、课后练习
- 基础题:将第八节课后练习的
createMultiplier函数,通过默认导出封装为独立模块,并在主文件导入调用; - 进阶题:封装通用场景的“数值区间筛选+等级转换”高阶函数(
filter+map),命名导出到ArrayFuncUtil,并在主文件导入实现“筛选100-200之间的数值并转换为对应区间标签(如100-150→'区间A',151-200→'区间B')”; - 综合题:基于模块化的高阶函数,实现通用数据的“数值统计(求和/乘积)→比例换算(0.9倍)→基础累加(步长10)”全链路逻辑。
九、下节预告
下一节将进入第十节:接口(interface)的核心约束与契约设计,重点学习:
- 接口的核心定义,理解其与高阶函数、模块化的关联(如约束高阶函数的参数类型);
- 接口的属性/方法约束语法,为通用数据(成绩/数值)建立类型契约;
- 接口与高阶函数的结合,实现类型安全的逻辑注入;
- 通用场景的接口实战(如
IScore/INumberData接口定义),为后续类的封装奠定类型基础。
十、鸿蒙开发者学习与认证指引
(一)、官方学习班级报名(免费)
- 班级链接:HarmonyOS赋能资源丰富度建设(第四期)
- 学号填写规则:填写个人手机号码即可完成班级信息登记
(二)、HarmonyOS应用开发者认证考试(免费)
-
考试链接:HarmonyOS开发者能力认证入口
-
认证等级及适配人群
- 基础认证:适配软件工程师、移动应用开发人员,需掌握HarmonyOS基础概念、DevEco Studio基础使用、ArkTS及ArkUI基础开发等能力;
- 高级认证:适配项目经理、工程架构师,需掌握系统核心技术理念、应用架构设计、关键技术开发及应用上架运维等能力;
- 专家认证:适配研发经理、解决方案专家,需掌握分布式技术原理、端云一体化开发、跨端迁移及性能优化等高级能力。
-
认证权益:通过认证可获得电子版证书以及其他专属权益。
浙公网安备 33010602011771号