Условные выражения с логическими значениями - TypeScript - PullRequest
1 голос
/ 03 августа 2020

У меня следующее условие:

useEffect(() => {
    const hasFalsyValue = (
      dropdownValue === undefined
      || dropdownValue === null
    );

    if (hasFalsyValue && !onChangeText) {
      return;
    }

    onChangeText(dropdownValue);
  }, [
    dropdownValue,
    onChangeText,
    inputProps,
  ]);

Если hasFalsyValue истинно, то эффект сразу же вернется. Но TS кричит на меня, говоря, что dropdownValue все еще может быть undefined

enter image description here

If I extract the conditions from the constant and put it inside the conditional parenthesis, it will work

введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Если hasFalsyValue истинно, то эффект сразу же вернется.

Нет - только если hasFalsyValue истинно и onChangeText ложь. Вы могли иметь в виду

const hasFalsyValue = (dropdownValue === undefined || dropdownValue === null);

if (hasFalsyValue || !onChangeText) {
  return;
}

onChangeText(dropdownValue);

или

const hasFalsyValue = (dropdownValue === undefined || dropdownValue === null);

if (!hasFalsyValue && onChangeText) {
  onChangeText(dropdownValue);
}

Кстати, я бы рекомендовал сократить это до

if (dropdownValue != null) {
  onChangeText?(dropdownValue);
}
1 голос
/ 03 августа 2020

Это почти нормально. вы неправильно использовали &&, а TypeScript не так умен, чтобы подбирать переменную, поэтому это должно работать:

# 1 Define guard

function isDefined<T>(v: T|undefined): v is T {
    return v!= null 
}

# 2 use it

if (!isDefined(dropdownValue) || !onChangeText) {
  return;
}
onChangeText(dropdownValue);

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