杨利杰YJlio博客头图

接口、类与对象建模

前言:别把一条工单拆散在多个数组里

大家好,我是杨利杰 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。状态是数字枚举,模板字符串直接输出的是枚举数值;如果页面需要“新建”等文字,应增加明确的显示映射,不要把数字直接当成用户文案。

这段只生成文本,没有接入页面列表。后续数组与渲染章节再使用同一结构,避免把本篇知识点扩成完整应用。

八、模型变化要检查所有引用

模型新增、删除或改变字段时,我会先查找接口引用,再逐个处理调用点和构建诊断。

模型变更与排查

  1. 在练习工程中保留接口、枚举和正常对象示例。
  2. 构建后记录当前工具版本与结果。
  3. 单独移除必填字段或改变字段类型,记录真实诊断后恢复。
  4. 增加可选附件名,检查读取位置是否处理缺失值。
  5. 再次构建,确认练习修改没有留下错误。
观察项实际记录
缺失必填字段的诊断待填写
字段类型不匹配的诊断待填写
构造后的标题内容待填写
可选字段缺失时的处理待填写
恢复后构建待填写

外部 JSON 即使被断言为 Ticket,也不会自动获得正确字段。进入程序时仍需解析、核对字段和状态范围,再建立内部对象。

不要用可选字段或强制转换隐藏模型变更遗漏;先确认业务允许,再修改约定。

学习总结

这篇我把同一条工单的字段放到对象中,用接口表达结构,并把类留给有明确创建行为的场景。结构约定、初始化和运行时校验各有职责。

发布前补齐实际诊断与构建记录。下一篇在工单数组上练习遍历、映射和筛选,为列表渲染准备数据。

参考资料

  1. 华为开发者联盟:ArkTS 语言概览
  2. 华为开发者文档:ArkTS 语法适配背景
  3. 华为开发者文档:类实现接口与跨文件样式复用

声明:本文为学习示例与练习方法,配图为知识示意图;语法、诊断和构建结果以当前工具链、实际工程及官方文档为准。

分隔线

返回顶部

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐