做鸿蒙 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);