Обнаружение успеха / неудачи с помощью Typescript Watcher Compiler API

API-интерфейсы компилятора Typescript позволяют программно создавать компиляторы часов с помощью ts.createWatchCompilerHost API, с примером его использования, продемонстрированным в документах Typescript здесь.

Этот API принимает обратный вызов в качестве последнего аргумента, который будет вызываться каждый раз при изменении статуса наблюдения, с предоставленным объектом Diagnostic, который описывает изменение статуса наблюдения.

Используя эти диагностические события, я пытаюсь различить состояние compiling, success и failure. Я обнаружил, что состояние compiling работает нормально, но я обнаружил странность при определении разницы между success и failure.

Проблема, с которой я столкнулся, связана с тем, что диагностические коды применяются следующим образом. Если при сборке произошла 1 ошибка, предоставляется код 6193, в противном случае предоставляется код 6194. Это означает, что код 6194 предоставляется, если ошибок не было (success) или было 2+ ошибки (failure). Эту логику можно увидеть в компиляторе ts

person casieber    schedule 23.07.2019    source источник
comment
Очень странно, что у него одинаковый диагностический код для 0 ошибок и 2+ ошибок. Код в компиляторе мне кажется неправильным, но он был выполнен несколько раз, так что, возможно, он правильный. Вы можете открыть вопрос об этом в репозитории машинописных текстов, чтобы узнать, что они говорят.   -  person David Sherret    schedule 24.07.2019
comment
На случай, если кто-то задастся тем же вопросом, я открыл проблему с репозиторием машинописного текста на github: Ссылка на выпуск.   -  person casieber    schedule 25.07.2019


Ответы (1)


TS 3.7

В TypeScript 3.7 теперь есть параметр errorCount на reportWatchStatusChanged:

function reportWatchStatusChanged(
    diagnostic: Diagnostic,
    newLine: string,
    options: CompilerOptions,
    // I'm not sure why this is nullable, I am asking in the issue
    errorCount?: number
) {
    // check error count here
}

До TS 3.7

Учитывая следующий хост часов из примера:

const host = ts.createWatchCompilerHost(
  configPath,
  {},
  ts.sys,
  createProgram,
  reportDiagnostic,
  reportWatchStatusChanged
);

Вы можете добавить флаг, который запускается обратным вызовом reportDiagnostic, а затем проверить и сбросить этот флаг в reportWatchStatusChanged.

Например:

let hadDiagnostics = false;

function reportDiagnostic(diagnostic: ts.Diagnostic) {
  hadDiagnostics = true;
  // ...etc...
}

function reportWatchStatusChanged(diagnostic: ts.Diagnostic) {
  if (hadDiagnostics) {
      console.log("Failed.");
      hadDiagnostics = false;
  } else {
      console.log("Success.");
  }

  // ...etc...
}
person David Sherret    schedule 24.07.2019
comment
Я думал об этом, но беспокоился только о том, есть ли какие-то сообщения Diagnostic, которые на самом деле не представляют собой настоящую ошибку. Каждый Diagnostic, переданный в reportDiagnostic, представляет некоторую действительную ошибку? - person casieber; 24.07.2019
comment
@casieber да. Я просто просмотрел источник, чтобы убедиться, что все они будут настоящими ошибками (посмотрите, как reportDiagnostic называется здесь). Однако, как вы упомянули в вопросе, было бы неплохо, если бы диагностический код отличался для успеха и сбоя с 2+ ошибками. - person David Sherret; 24.07.2019
comment
Понятно. Спасибо. Я отмечу это как ответ и уточню у команды TS, есть ли что-то особенное. - person casieber; 24.07.2019