Как проверить наличие нулевого значения в строке и выдать ошибку в машинописи? - PullRequest
1 голос
/ 27 марта 2020

В C# я могу написать код для проверки нулевых ссылок и в случае, если выдается специальное исключение, например:

var myValue = (someObject?.SomeProperty ?? throw new Exception("...")).SomeProperty;

В последних обновлениях TypeScript введен оператор объединения нулей ?? но использование его, как в приведенном выше выражении, приводит к ошибке компиляции. Существует ли какой-либо подобный допустимый синтаксис в TypeScript?


Для пояснения желаемое поведение достигается с помощью следующего кода:

  if(someObject?.someProperty == null) {
    throw new Error("...");
  }

  var myValue = someObject.someProperty.someProperty;

Код:

  var myValue = someObject?.someProperty.someProperty;

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

1 Ответ

1 голос
/ 27 марта 2020

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

Существует предложение JavaScript для throw выражений прорабатывая процесс TC39, который в настоящее время находится на этапе 2. Если он дойдет до этапа 3 (и он уже соответствует обычным критериям, поэтому комитет, вероятно, будет стремиться к консенсусу для продвижения вперед на следующем заседании), вы можно ожидать, что вскоре он появится в TypeScript.

С выражением throw вы можете написать это (если вам нужно значение someObject.someProperty):

const myValue = someObject?.someProperty ?? throw new Error("custom error here");

или если вы хотите someObject.someProperty.someProperty (что, как я думаю, ваша C# версия делает):

const myValue = (someObject?.someProperty ?? throw new Error("custom error here")).someProperty;

Для него есть плагин Babel , который вы можете использовать сейчас. Вот первый пример, приведенный выше для REPL Бабеля.


Примечание: Вы сказали, что хотите выбросить ошибку custom , но для всех, кто читает это тот, кто не нуждается в пользовательской ошибке:

Если вы хотите someObject.someProperty.someProperty, без ошибок, если someObject равно null / undefined, но выдает ошибку, если someObject.someProperty равно null / undefined, вы можете сделать:

const myValue = someObject?.someProperty.someProperty;

С этим:

  • Если someObject равен null или undefined, myValue получит значение undefined
  • Если someObject не null или undefined, а someObject.someProperty - null или undefined, вы получите ошибку, потому что мы не использовали ?. после первого someProperty.
  • Если someObject и someObject.someProperty оба не null или undefined, myValue получит результат поиска someObject.someProperty.someProperty.
...