鸿蒙ArkTs:如何给键值对对象安全追加数据

做鸿蒙 App 埋点功能时,有一个叫ext_params的 “扩展参数对象”(用来存渠道、按钮名称等信息),我们需要给这个对象追加一个 IP 字段(比如ip: “192.168.1.1”)。

// 埋点入参的模板:规定哪些字段必填/可选
export interface ClickInfo {
  event_id: string; // 必填:事件ID
  event_name: string; // 必填:事件名称
  page: string; // 必填:页面名称
  page_path: string; // 必填:页面路径
  ext_params?: Record<string, string>; // 可选:扩展参数(键值对对象)
}

// 最终传给日志工具的模板
export interface BehaviorLogParams {
  user_id: string;
  event_id: string;
  event_name: string;
  device_type: string;
  os_version: string;
  app_version: string;
  page: string;
  page_path: string;
  timestamp: number;
  ext_params?: Record<string, string>; // 和上面的扩展参数类型一致
}

直接追加:

clickInfo.ext_params[‘ip’] = ‘xxx’

ext_params是可选参数,可能为undefined,直接赋值会报错

如果用如下:

Object.assign(clickInfo.ext_params, {ip: ‘xxx’})

ArkTS 禁止使用Object.assign等标准库方法

如何解决呢?

我的思路是:先处理空对象 → 加类型标注 → 再追加字段,全程只用 ArkTS 原生语法,不碰受限方法。

// 声明变量并指定类型:必须是“键值对对象”
let extParams: Record<string, string>;

// 第一步:判断ext_params是否存在
if (clickInfo.ext_params) {
  // 存在就直接用
  extParams = clickInfo.ext_params;
} else {
  // 不存在就初始化空对象,且加类型标注(解决“无类型”报错)
  extParams = {} as Record<string, string>;
}

// 给对象追加IP字段(此时extParams一定是对象,不会报错)
extParams['ip'] = behaviorLogger.ipAddress;

把追加好字段的对象,放到最终要使用的地方:

// 组装日志参数
const logParams: BehaviorLogParams = {
  user_id: '',
  event_id: clickInfo.event_id,
  event_name: clickInfo.event_name,
  device_type: 'phone', // 固定值:设备是手机
  os_version: '',
  app_version: '',
  page: clickInfo.page,
  page_path: clickInfo.page_path,
  timestamp: 0, // 可改成Date.now()获取当前时间
  ext_params: extParams // 用追加了IP的对象
};

// 调用日志工具发送埋点
behaviorLogger.logEvent(logParams);