Получение Typescript strictNullChecks для работы с неопределенными возвращающими функциями vanilla js - PullRequest
1 голос
/ 12 января 2020

При использовании idiomati c js, возвращающем неопределенное значение при ошибке, преобразованном в TS

function multiply(foo: number | undefined){
   if (typeof foo !== "number"){
      return;
   };
   return 5 * foo;
}

При использовании умножения в новом коде TS возникает проблема с компилятором, считая, что doStuff может вернуть неопределенное значение, когда не может.

Поэтому я попытался написать «небезопасную» версию этой функции, вызываемую безопасным кодом TS, оставив безопасную версию для обычного js кода.

function unsafeMultiply(num: number){
   return multiply(num);
}

, поскольку unsafeMultiply может принимать только число, тип guard в умножении должен учитывать, что умножение будет возвращать только число, так как unsafeMultiply может обрабатывать только номер. Если это слишком сложно для компилятора, как я могу заставить его принять, я знаю, что я делаю?

1 Ответ

3 голосов
/ 12 января 2020

При использовании умножения в новом коде TS возникает проблема с компилятором, который полагает, что doStuff может вернуть неопределенное значение, когда это невозможно.

Да, он может: multiply(undefined) возвращает undefined.

Если это слишком сложно для компилятора, как я могу заставить его принять, я знаю, что я делаю?

Вы можете сделать утверждение типа , поскольку вы знаете, что multiply вернет undefined только если он вызывается с ненулевым числом:

function unsafeMultiply(num: number) {
   return multiply(num) as number;
}

Или вы можете добавить код для защиты типов во время выполнения:

function unsafeMultiply(num: number) {
  let result = multiply(num);
  if (typeof result === "undefined") {
    throw new Error("Invalid num argument");
  }
  return result;
}

Но если бы это был я, я бы отключил функцию multiply или вернул бы NaN вместо того, чтобы возвращать undefined, если дано undefined. Тогда unsafeMultiply не понадобится.

...