以编程方式访问 TypeScript 调用堆栈

Mar*_*off 6 callstack typescript console.log

我正在开发 TypeScript 调试工具,但遇到了似乎无法以编程方式访问 TypeScript 调用堆栈的问题。

当我这样做时:

   const error = new Error();
   console.log(error.stack);
Run Code Online (Sandbox Code Playgroud)

我得到了预期的结果,并且可以看到 TypeScript 调用堆栈。

但如果我这样做:

   const error = new Error();
   const errorStack = error.stack;
   console.log(errorStack);
Run Code Online (Sandbox Code Playgroud)

我只得到 JavaScript 堆栈,而不是预期的 TypeScript 堆栈。

问题在于如何或何时应用源映射。

有没有办法将第一个示例中作为控制台输出获得的相同信息获取到 TypeScript/JavaScript 变量中?任何帮助是极大的赞赏!

Mar*_*off 1

这是重现该问题的一些信息!

\n\n

首先创建一个包含以下内容的文件“logger.ts”:

\n\n
class DebugLogging {\n  public log(msg: string) {\n    const error = new Error();\n    console.log(error.stack);\n\n    const errorStack = error.stack;\n    console.log(errorStack);\n\n    const realStringStack = "-> " + error.stack;\n    console.log(realStringStack);\n\n    debugger\n\n    console.log(msg);\n  }\n}\n\nconst logger = new DebugLogging();\nlogger.log("test");\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后使用以下命令编译 TypeScript 文件:

\n\n
tsc --source-map logger.ts\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,创建一个包含以下内容的文件“logger.html”:

\n\n
<html>\n  <head>\n    <script src="logger.js"></script>\n  </head>\n  <body>\n    <p>look at the console output...</p>\n  <body>\n</html>\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Chrome 浏览器(我使用的是 V80.0.3987.163)中打开 HTML 文件,然后查看 JavaScript 控制台,它应该已经停止了“调试器”语句。

\n\n

前两个console.log语句的输出均按预期显示相同的 TypeScript 调用堆栈。但第三个console.log的输出显示的是 JavaScript 调用堆栈。

\n\n

一旦调用堆栈转换为字符串,映射信息就会丢失。

\n\n

您现在可以在控制台中进行实验,如下所示以获得预期结果:

\n\n
> error // display the contents of the Error object\n< Error\n    at DebugLogging.log (logger.ts:3)\n    at logger.ts:16\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在出现了奇怪的情况:通过在控制台中输入以下内容,您将获得 JavaScript 调用堆栈,而不是字符串形式的 TypeScript 调用堆栈:

\n\n
> error.stack // display the contents of the Error object\'s stack property\n< "Error\n    at DebugLogging.log (file:///home/me/exer/tss/logger.js:5:21)\n    at file:///home/me/exer/tss/logger.js:15:8"\n\n> error.stack.split(/at /) // display the contents of the Error object\'s stack property split into parts\n< (3)\xc2\xa0["Error\xe2\x86\xb5    ", "DebugLogging.log \n         (file:///Users/shunyam/exer/tss/logger.js:5:21)\xe2\x86\xb5    ", \n         "file:///Users/shunyam/exer/tss/logger.js:17:8"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,回到我原来的问题。如何将 TypeScript 调用堆栈的内容放入变量中以实际操作它?

\n\n

感谢您的时间!

\n