Javascript 如何在TypeScript中获取源代码中的实际行(用于自定义日志记录)

Javascript 如何在TypeScript中获取源代码中的实际行(用于自定义日志记录),javascript,node.js,typescript,electron,Javascript,Node.js,Typescript,Electron,引用我正在使用这段代码查找调用我的自定义日志函数的行号: /** * eLog - displays calling line number & message & dumps vars as pretty json string * @param {string} msg - string to display in log message * @param {any} dispVars - any number of variables (ellipsis , aka

引用我正在使用这段代码查找调用我的自定义日志函数的行号:

/**
 * eLog - displays calling line number & message & dumps vars as pretty json string
 * @param {string} msg - string to display in log message
 * @param {any} dispVars - any number of variables (ellipsis , aka Rest parameters) to dump
 */
function eLog(msg:string,...dispVars:any[]){
    let caller_line = (new Error).stack.split("\n")[4];
    console.log(`eLog->Line#${caller_line}->${msg}->`);
    console.log(JSON.stringify((new Error).stack.split("\n"),null,2));
    dispVars.forEach(value => {
        console.log(JSON.stringify(value,null,2));
    });
}
这样称呼:

eLog("eLog Test",this);
虽然这确实正确地转储了
.js
文件行,但我需要源行,
.ts
行号。我怎样才能正确地生成它

我怎样才能正确地生成它

a、 )您拥有的代码相当依赖于用户运行时(例如,在IE中不起作用)


b、 )js->ts需要源地图才能工作。让事情变得容易的东西还不存在。使用sourcemaps的默认原始包是:

我在晚上讨论了这个问题,并提出了一个我很满意的函数。感谢您在开始时提供的帮助-

将其分离为
log.ts

require('source-map-support')。安装({
环境:“节点”
});
/**
*eLog-将呼叫行号、消息和转储变量显示为漂亮的json字符串
*@param{string}msg-要在日志消息中显示的字符串
*@param{any}dispVars-要转储的任意数量的变量(省略号,又称Rest参数)
*{@linkhttps://github.com/evanw/node-source-map-support 可由typescript节点源映射支持模块使用}
*{@linkhttps://github.com/mozilla/source-map/ Mozilla源地图库和项目}
*{@linkhttp://www.html5rocks.com/en/tutorials/developertools/sourcemaps/ 很好地介绍了sourcemaps}
*/
导出函数eLog(msg:string,…dispVars:any[]){
/**
*回电话一行
*@type{string}
*/
让stackLine=(新错误).stack.split(“\n”)[2];
/**
*检索最后一个“/”到“)”之后的文件basename和位置数据
*/
// 
让调用者_line=stackLine.slice(stackLine.lastIndexOf('/')、stackLine.lastIndexOf('))
/**
*测试是否有“/”;如果没有“/”,则使用不带前缀路径的文件名
*/ 
if(调用者_line.length==0){
调用者_line=stackLine.slice(stackLine.lastIndexOf('('),stackLine.lastIndexOf('))
}
// 
/**
*filename\u base-解析出文件basename;删除第一个“/”字符并转到:`
*/
让filename_base=caller_line.slice(0+1,caller_line.indexOf(':');
/**
*行号-解析行号;删除第一个“:”字符并转到第二个“:`
*/
设line_no=caller_line.slice(caller_line.indexOf(':')+1,caller_line.lastIndexOf(':');
/**
*line_pos-line positional-从最后一个“:”到字符串末尾
*/
让line_pos=caller_line.slice(caller_line.lastIndexOf(':')+1);
log(`eLog被${line_no}@char#${line_pos}行上的${filename_base}调用,表示:\n${msg});
//将输入变量打印为漂亮的JSON字符串
dispVars.forEach(值=>{
log(JSON.stringify(value,null,2));
});
}