You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现带变量名标识的TypeScript ILog函数?

解决方案

方法一:模板字符串标签函数(推荐)

利用ES6模板字符串的标签函数特性,同时获取表达式文本和对应的值,无需重复编写内容。

实现代码

function ILog<T>(strings: TemplateStringsArray, value: T): T {
  // 通过错误栈解析获取调用时的表达式文本
  const err = new Error();
  const stackLine = err.stack?.split('\n')[2] || '';
  // 匹配标签函数调用的插值表达式
  const exprMatch = stackLine.match(/ILog`\$\{(.+?)\}`/);
  const expr = exprMatch ? exprMatch[1] : 'unknown';
  
  console.log(`ILog(${expr}): ${value}`);
  return value;
}

使用方式

let a = false;
let b = false;
let c = false;

// 用模板字符串标签语法调用
ILog`${a}`;
ILog`${b}`;
ILog`${c}`;

输出结果

$ node file.js
ILog(a): false
ILog(b): false
ILog(c): false

方法二:兼容原调用语法(依赖Node.js环境)

如果想保留ILog(a)的原始调用方式,可以通过解析错误栈提取参数表达式。

实现代码

const ILog = <T>(value: T): T => {
  const err = new Error();
  // 提取调用栈中ILog的调用行
  const stackLine = err.stack?.split('\n')[2] || '';
  // 匹配ILog(xxx)中的参数部分
  const exprMatch = stackLine.match(/ILog\((.*?)\)/);
  const expr = exprMatch ? exprMatch[1].trim() : 'unknown';
  
  console.log(`ILog(${expr}): ${value}`);
  return value;
};

使用方式

和原代码完全一致:

let a = false;
let b = false;
let c = false;

ILog(a);
ILog(b);
ILog(c);

注意事项

  • 该方法依赖Node.js的错误栈格式,在浏览器或其他环境需要调整栈行索引或正则匹配规则。
  • 支持复杂表达式,比如ILog(a + b)也能正确提取表达式文本。

内容的提问来源于stack exchange,提问作者Carlo Augusto Bagnoli Gomez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:25:20