【鸿蒙心迹】HarmonyOS学习笔记06:接口与对象建模
🔥 个人主页: 杨利杰YJlio
❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》
《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》
🌟 让复杂的事情更简单,让重复的工作自动化


文章目录
前言:别把一条工单拆散在多个数组里
大家好,我是杨利杰 YJlio。
标题放一个数组、状态放另一个数组,刚开始看起来简单;删除或排序之后,一条工单的字段就可能错位。这篇我把同一条记录放进对象,再用接口描述结构。
这是 HarmonyOS 7.0 学习笔记第 06 篇。接口、对象和类分别解决不同问题:接口表达约定,对象保存具体值,类可以组织创建过程与行为。
接口描述数据结构,不会替外部输入执行运行时校验。
| 环境项 | 本次记录 |
|---|---|
| DevEco Studio | 待填写 |
| SDK/API | 待填写 |
| 工程 | 当前 ArkTS 练习工程 |
| 数据对象 | IT 工单摘要 |
本文代码为学习示例,配图为示意图;不预先填写真实构建、诊断或运行结果。
一、先让字段属于同一条记录
我先确定列表需要哪些信息,再把它们放进同一个工单对象。

| 字段 | 业务含义 |
|---|---|
id | 工单标识 |
title | 工单标题 |
category | 分类 |
status | 当前状态 |
createdAt | 创建时刻的时间戳 |
这样排序、筛选或传递对象时,字段可以一起移动。它不会自动保证标识唯一或状态合法,这些仍要靠数据层规则。
二、用接口把字段类型写清楚
本篇沿用命名枚举表达状态,避免在多个文件散落任意字符串;具体语法仍需按当前 ArkTS 工具链确认。

enum TicketStatus {
New = 0,
Processing = 1,
Resolved = 2
}
interface Ticket {
id: string;
title: string;
category: string;
status: TicketStatus;
createdAt: number;
}
接口让使用者知道一条记录需要哪些字段和类型。它不是某条具体工单,也不能用 new Ticket() 创建记录。
如果字段缺失或类型不匹配,应查看实际诊断;不要为消除错误把所有字段改成可选。接口的声明与真实业务需求应当一致。
三、对象字面量保存具体值
结构确定后,我用带明确类型的对象字面量创建一条练习记录。

const ticket: Ticket = {
id: 'T-1001',
title: '无法连接办公网络',
category: '网络',
status: TicketStatus.New,
createdAt: Date.now()
};
T-1001 是示例标识,Date.now() 取得创建时刻的时间戳。本例不提供服务器标识生成、时间同步或时区显示逻辑。
图中“创建时的时间戳”是这个字段的说明,没有虚构一次运行的数字。完成本机实验后,再记录实际值和设备环境。
四、只有需要创建行为时再引入类
如果对象只是一组字段,接口加对象就足够表达本篇练习;需要稳定的创建规则或方法时,我才考虑类。

| 需求 | 本篇采用的方式 |
|---|---|
| 约定有哪些字段 | 接口 |
| 保存一条具体记录 | 对象 |
| 在创建时处理标题 | 类的构造函数示例 |
类也可以作为类型使用,但接口不会自动产生运行时构造逻辑。不要仅为了形式统一就把每条数据都改成类实例。
华为跨文件样式复用文档也展示了类通过 implements 实现接口的用法。这里引用它说明语法关系,不把其组件样式代码当成本篇业务模型。
五、构造函数承担明确的初始化
下面的 TicketDraft 只演示两个字段的初始化,与前面的完整 Ticket 不是同一个模型。

class TicketDraft {
title: string;
category: string;
constructor(title: string, category: string) {
this.title = title.trim();
this.category = category;
}
}
const draft: TicketDraft = new TicketDraft(' 网络故障 ', '网络');
构造时只处理标题首尾空白,分类保留传入值。trim() 不是完整标题校验:输入全是空格时,处理后仍可能为空。真正保存工单前,还要应用上一节的校验规则。
官方ArkTS 语法适配背景说明了属性显式初始化的要求。本例在构造函数中赋值,实际构建仍以当前工程为准。
初始化只保证按代码赋值,不等于业务数据已经校验通过。
六、可选字段要有真实业务理由
有的工单没有附件,可以把附件名称作为可选信息;标题、标识和状态是否必填,则应按业务要求确定。

interface TicketWithAttachment extends Ticket {
attachmentName?: string;
}
function getAttachmentLabel(item: TicketWithAttachment): string {
return item.attachmentName === undefined
? '未提供附件名称'
: item.attachmentName;
}
这段例子处理“字段缺失”,没有把空字符串自动视作缺失。如果业务禁止空附件名,需要另加规则。
可选字段会影响每个读取位置。增加它之前,我会确认何时可以不存在,以及页面、日志和存储层分别如何处理。
七、让函数接收完整工单对象
格式化函数接收一个 Ticket,比单独传几个容易顺序错位的参数更清楚。

function formatTicket(item: Ticket): string {
return `${item.id} | ${item.title} | ${item.status}`;
}
const summary: string = formatTicket(ticket);
这里沿用前面的 ticket。状态是数字枚举,模板字符串直接输出的是枚举数值;如果页面需要“新建”等文字,应增加明确的显示映射,不要把数字直接当成用户文案。
这段只生成文本,没有接入页面列表。后续数组与渲染章节再使用同一结构,避免把本篇知识点扩成完整应用。
八、模型变化要检查所有引用
模型新增、删除或改变字段时,我会先查找接口引用,再逐个处理调用点和构建诊断。

- 在练习工程中保留接口、枚举和正常对象示例。
- 构建后记录当前工具版本与结果。
- 单独移除必填字段或改变字段类型,记录真实诊断后恢复。
- 增加可选附件名,检查读取位置是否处理缺失值。
- 再次构建,确认练习修改没有留下错误。
| 观察项 | 实际记录 |
|---|---|
| 缺失必填字段的诊断 | 待填写 |
| 字段类型不匹配的诊断 | 待填写 |
| 构造后的标题内容 | 待填写 |
| 可选字段缺失时的处理 | 待填写 |
| 恢复后构建 | 待填写 |
外部 JSON 即使被断言为 Ticket,也不会自动获得正确字段。进入程序时仍需解析、核对字段和状态范围,再建立内部对象。
不要用可选字段或强制转换隐藏模型变更遗漏;先确认业务允许,再修改约定。
学习总结
这篇我把同一条工单的字段放到对象中,用接口表达结构,并把类留给有明确创建行为的场景。结构约定、初始化和运行时校验各有职责。
发布前补齐实际诊断与构建记录。下一篇在工单数组上练习遍历、映射和筛选,为列表渲染准备数据。
参考资料
声明:本文为学习示例与练习方法,配图为知识示意图;语法、诊断和构建结果以当前工具链、实际工程及官方文档为准。

更多推荐



所有评论(0)