Как проверить ничтожность в машинописи, используя скобки - PullRequest
0 голосов
/ 04 июля 2019

Я хочу проверить, существует ли массив внутри объекта, не является ли он нулевым и не пустым

Мне нужно сослаться на это свойство в скобочных обозначениях.

Мой объект

profile = {
    myArray: [1,2,3]
}

И я проверяю это следующим образом

const section = "myArray";
if(section in profile && profile[section] && profile[section].length ) { // do something}

Я ожидаю, что это сработает, но я получаю сообщение об ошибке profile[section].length, в котором говорится object is possibly null or undefined

Если ясделать это с помощью точечной нотации, это работает правильно

if('myArray' in profile && profile.myArray && profile.myArray.length ) { // do something}

1 Ответ

0 голосов
/ 05 июля 2019

Это известная ошибка , чье fix существует, но может не попасть в язык из-за возможных проблем с производительностью.

Что мы можем сделать, пока будем ждать?Ну, один из возможных обходных путей - это ввести определенную пользователем функцию защиты типов , которая выполняет ту же самую проверку внутри, но заставляет компилятор сузить тип вашего объекта так, как вы надеялись:

function hasDefinedProp<T, K extends keyof T>(
  obj: T,
  k: K
): obj is T & Required<Pick<T, K>> {
  return !!obj[k];
}

Тип T & Required<Pick<T, K>> означает, что это тот же тип, что и T, за исключением того, что свойство K -keyed является обязательным и поэтому не может иметь значение null / undefined.Давайте посмотрим на это в действии:

if (
  section in profile &&
  hasDefinedProp(profile, section) &&
  profile[section].length // okay now
) {
  // do something
}

Выглядит хорошо!Надеюсь, это поможет;удачи.

Ссылка на код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...