羽球联盟模型设计(04):ArkTS 严格模式下如何兼容本地与远程内容
内容型应用的数据不会永远来自同一个地方:冷启动依赖本地资源,刷新后可能拿到远程链接,详情正文又包含文本、单图和图集。羽球联盟把这些差异收进 common 模型层,让页面只消费稳定实体。本次当前工程构建通过,模型被业务页面和公共组件共同引用。
默认值先消化空状态
ArkTS 严格模式下,随意拼对象字面量会让可选字段和类型分支扩散到每个页面。当前模型用 class 与默认值定义实体,使页面拿到对象后即可渲染基础字段。
export class Article {
id: string = '';
title: string = '';
cover: Resource = $r('app.media.startIcon');
tag: string = '';
author: string = '';
publishTime: string = '';
readCount: number = 0;
summary: string = '';
content: ContentBlock[] = [];
category: 'event' | 'equipment' | 'skill' = 'event';
coverUrl?: string;
source?: string;
url?: string;
}
默认值并不代表忽略异常。它的作用是保证基础 UI 不会因为一个缺失字段直接中断,远程数据校验仍应在仓库层完成。
Resource 与 URL 为什么要并存
本地目录使用 Resource,联网内容通常给出 URL。如果强行只保留一个字符串字段,本地资源会被迫转换;如果只保留 Resource,远程图片又无法自然进入模型。双字段让渲染层按“远程优先、本地兜底”选择来源。
正文则进一步拆成块:
export class ContentBlock {
type: 'text' | 'image' | 'gallery' = 'text';
text?: string;
image?: Resource;
images?: Resource[];
caption?: string;
imageUrl?: string;
imageUrls?: string[];
}
详情页据此分发不同视图,后续增加引用块或代码块时,也不必拆解一整段长字符串。
模型边界的失败案例
如果把路由对象、函数或 UI 上下文放进模型,持久化和跨模块传递都会变得困难;如果用列表下标代替稳定 id,刷新排序后收藏与历史会指向错误内容;如果每个页面自行定义“精简版 Article”,搜索、详情和收藏之间很快会出现字段不一致。
当前模型只保存可描述的业务事实,页面行为通过回调和服务完成。这使资讯卡片、详情、搜索和历史能够共享同一条内容记录。
模型设计的目标不是字段越多越好,而是把数据来源差异、默认值和扩展点提前说明。严格模式会放大含糊边界,也正因为如此,先把实体定义清楚能显著减少页面层的防御代码。
项目证据图:羽球联盟既有安装包首页展示资讯卡片所依赖的封面、标题、标签与摘要等可见内容字段。当前源代码已构建通过;该图仅说明既有安装包的内容呈现,不将本地/远程模型分支写成已在本次构建包逐项运行。



















