Programmati c Доступ к стеку вызовов TypeScript - PullRequest
0 голосов
/ 04 апреля 2020

Я работаю над инструментом отладки TypeScript и столкнулся с проблемой, из-за которой я не могу получить программный доступ к стеку вызовов TypeScript.

Когда я делаю это:

   const error = new Error();
   console.log(error.stack);

Я получаю ожидаемый результат и вижу стек вызовов TypeScript.

Но если я сделаю это:

   const error = new Error();
   const errorStack = error.stack;
   console.log(errorStack);

Я получу только стек JavaScript вместо ожидаемого Стек TypeScript.

Проблема заключается в том, как или когда применяются карты источника.

Есть ли способ получить ту же информацию, что и консольный вывод в первом примере, в TypeScript? / JavaScript переменная? Любая помощь с благодарностью!

1 Ответ

0 голосов
/ 05 апреля 2020

Вот некоторая информация, чтобы воспроизвести проблему!

Сначала создайте файл 'logger.ts' с таким содержанием:

class DebugLogging {
  public log(msg: string) {
    const error = new Error();
    console.log(error.stack);

    const errorStack = error.stack;
    console.log(errorStack);

    const realStringStack = "-> " + error.stack;
    console.log(realStringStack);

    debugger

    console.log(msg);
  }
}

const logger = new DebugLogging();
logger.log("test");

Затем скомпилируйте файл TypeScript с помощью:

tsc --source-map logger.ts

Теперь создайте файл 'logger. html' со следующим содержимым:

<html>
  <head>
    <script src="logger.js"></script>
  </head>
  <body>
    <p>look at the console output...</p>
  <body>
</html>

Откройте файл HTML в браузере Chrome (я использую V80. 0.3987.163) и посмотрите на консоль JavaScript, которая должна была остановить оператор 'debugger'.

Вывод первых двух console.log оба оператора отображают, как ожидается, один и тот же стек вызовов TypeScript. Но выходные данные третьего console.log показывают вместо этого стек вызовов JavaScript.

Как только стек вызовов преобразуется в строку, сопоставление информация потеряна.

Теперь вы можете поэкспериментировать в консоли, например, чтобы получить ожидаемый результат:

> error // display the contents of the Error object
< Error
    at DebugLogging.log (logger.ts:3)
    at logger.ts:16

Теперь прибывает странный момент: введя это в консоли, вы получите получить стек вызовов JavaScript вместо стека вызовов TypeScript в виде строки:

> error.stack // display the contents of the Error object's stack property
< "Error
    at DebugLogging.log (file:///home/me/exer/tss/logger.js:5:21)
    at file:///home/me/exer/tss/logger.js:15:8"

> error.stack.split(/at /) // display the contents of the Error object's stack property split into parts
< (3) ["Error↵    ", "DebugLogging.log 
         (file:///Users/shunyam/exer/tss/logger.js:5:21)↵    ", 
         "file:///Users/shunyam/exer/tss/logger.js:17:8"]

Теперь вернемся к моему первоначальному вопросу. Как я могу получить содержимое стека вызовов TypeScript в переменную, чтобы реально манипулировать ею?

Спасибо за потраченное время!

...