Можно ли сделать сбой TypeScript в 0/0 и Math.log (-1) вместо возврата NaN? - PullRequest
0 голосов
/ 27 ноября 2018

У меня сложилось впечатление, что я могу доверять Flow или TypeScript, чтобы защитить меня от ошибок NaN, но это не так.

Вот репозиторий PoC, который демонстрирует проблему: https://github.com/ndbroadbent/typescript-experiments

const testFunction = (a: number, b: number) => {
  if (a > b) {
    return;
  } else if (a < b) {
    return;
  } else if (a === b) {
    return;
  } else {
    throw new Error("Unreachable code");
  }
}

Эта функция прекрасно работает при вызове с:

testFunction(1, 2);

Но следующие вызовы приведут к ошибке:

testFunction(1, 0 / 0);

testFunction(1, Math.log(-1));

testFunction(1, Math.sqrt(-2));

testFunction(1, parseFloat('string'));

Вы можете сказать, что это "правильно"поведение, но я бы предпочел написать код, который не должен обрабатывать какие-либо значения NaN.Я хочу получить ошибку во время выполнения, как только JavaScript попытается вызвать 0 / 0 или Math.log(-1), чтобы мой отчет об ошибках был легок для понимания, и я мог решить реальную проблему.Когда NaN распространяется через ваш код и происходит сбой в каком-то случайном месте, может быть трудно найти источник.

Должно быть легко переопределить Math.log и Math.sqrt, чтобы аварийно завершить работу всякий раз, когда результат будетбыть NaN.И я мог бы написать плагин Babel, который преобразует a / b во что-то вроде assertNotNaN(a / b) или даже safeDivide(a, b).(Я также хочу выдать ошибку деления на ноль вместо того, чтобы возвращать бесконечность.)

Существуют ли другие функции, которые мне нужно переопределить или перенести?

Обратите внимание, что с TypeScript,Мне нужно заботиться только о математических операциях, которые могут вернуть NaN.TypeScript предотвратит ошибки типа, такие как {} + 1.

...