HarmonyOS鸿蒙Next中巧用标签模板字面量,为模板字符串和参数打印日志

HarmonyOS鸿蒙Next中巧用标签模板字面量,为模板字符串和参数打印日志 函数参数有问题时,每次都要单独创建result变量,手写console.log来打印模板字符串和参数。

太麻烦了,有没有更方便的方法?

const strings = ['hello', 'world']
const result = `你好${strings[0]},世界${strings[1]}`
const func = (s: string) => {
}

console.log('参数1: ', strings[0], ',参数2: ', strings[1])
console.log('结果:', result);
func(result)

是否能用模板字面量(tagged template)来简化这一流程?


更多关于HarmonyOS鸿蒙Next中巧用标签模板字面量,为模板字符串和参数打印日志的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

可以参考如下代码,直接用log``就能打印模板字符串及其参数:

function log(strings: TemplateStringsArray, ...values: string[]) {
  const evaluated = strings.reduce((prev, curr, i) =>
  prev + curr + (values[i] !== undefined ? values[i] : ''), '');

  console.log('参数: ', values.toString())
  console.log('结果:', evaluated);

  return evaluated;
}

const strings = ['hello', 'world']
const func = (s: string) => {
}

func(log`你好${strings[0]},世界${strings[1]}`)

DevEco Studio日志:

cke_736.png

更多关于HarmonyOS鸿蒙Next中巧用标签模板字面量,为模板字符串和参数打印日志的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,标签模板字面量可用于自定义日志输出。通过定义标签函数处理模板字符串和参数,可实现格式化日志记录。例如,使用log标签函数解析模板字符串中的变量,并整合时间戳或日志级别。代码示例:logInfo: ${message},其中log`为自定义标签函数,对模板内容进行处理后输出。

在HarmonyOS Next(API 11+)的ArkTS中,利用标签模板字面量(tagged template)来封装日志打印是一个高效且优雅的方案。这能直接将模板字符串的原始部分和插值参数自动捕获并格式化输出,无需手动拼接。

以下是一个可直接使用的 debug 标签函数实现:

function debug(strings: TemplateStringsArray, ...values: any[]): string {
  // 1. 组合原始字符串和插值
  let message = '';
  for (let i = 0; i < strings.length; i++) {
    message += strings[i];
    if (i < values.length) {
      message += `{${i}}`; // 占位符,也可直接嵌入 values[i]
    }
  }

  // 2. 构造详细的日志信息
  const logInfo = {
    timestamp: new Date().toISOString(),
    template: strings.raw, // 原始模板字符串部分
    values: values,        // 所有插值参数
    formatted: message     // 组合后的字符串
  };

  // 3. 打印到控制台
  console.log('[DEBUG]', logInfo);

  // 4. 返回组合后的字符串,供后续使用
  return message;
}

使用示例:

const strings = ['hello', 'world'];
const result = debug`你好${strings[0]},世界${strings[1]}`;
// 控制台输出:
// [DEBUG] {
//   timestamp: "2024-01-01T12:00:00.000Z",
//   template: ["你好", ",世界", ""],
//   values: ["hello", "world"],
//   formatted: "你好{0},世界{1}"
// }

const func = (s: string) => {
  // 函数逻辑
};

func(result); // result 的值为 "你好{0},世界{1}"

优势:

  1. 自动解构:标签函数自动接收模板的静态部分(strings)和动态插值(values),无需手动遍历。
  2. 信息完整:可同时记录原始模板、实际参数和格式化后的字符串,调试信息更全面。
  3. 减少重复代码:无需为每个调试点手动编写 console.log 和拼接字符串。
  4. 保持代码简洁:使用标签模板语法(debug`...`)直观且嵌入自然。

扩展建议:

  • 可根据需要调整输出格式,例如使用 JSON.stringify 美化输出。
  • 可添加环境判断(如开发/生产模式)来禁用日志。
  • 可集成更复杂的日志级别(INFO、WARN、ERROR)。

这种方法通过标签模板字面量将调试日志封装为可复用的工具函数,显著提升了开发效率。

回到顶部