Как устранить ошибку TS2532: Объект, возможно, «не определен»

#typescript

Вопрос:

У меня есть код, в котором я должен несколько раз проверять сложное состояние. Например: (a amp;amp; b) || c и т. Д. Я попытался добавить переменную с моим условием , например const hasSomething = (a amp;amp; b) || c , и столкнулся с проблемой с TS, которую я не могу решить.

Пример Работает:

 function add(a?: number, b?: number): number {

    if (a amp;amp; b) {
        return a   b;
    }
    return 0;
}
 

Не работает:

 function add(a?: number, b?: number): number {
    const hasNumbers = a amp;amp; b;

    if (hasNumbers) {
        return a   b;
               ^   ^
               TS2532: Object is possibly 'undefined'.
    }
    return 0;
}
 

Есть ли какой-либо обходной путь, чтобы исправить это без ненулевого утверждения ! ?

Ответ №1:

Легко исправить :D. Просто обновите версию TypeScript до 4.4:

 function add(a?: number, b?: number): number {
    const hasNumbers = a amp;amp; b;
    if (hasNumbers) {
        return a   b;
    }
    return 0;
}
 

Игровая площадка

Ответ №2:

оператор amp;amp; (и) с номером работает не так, как ожидалось:

если вы используете его таким образом:

 const foo = 3 amp;amp; 4
 

вы можете видеть, что typeof foo это "number" так .

На самом деле операторы amp;amp; возвращают:

  • последнее число, если результат будет истинным, например: 5 amp;amp; 4 true так ли это, что оно вернется 4
  • ложное значение есть одно: пример 0 amp;amp; 4 имеет 0 как ложное значение и вернется 0 , то же самое с undefined amp;amp; 4 этим вернется undefined

Версии машинописного текста ниже, чем 4.4.0 на самом деле, не поймут, какой будет реальный результат из-за того, что это может быть undefined AFAIK.

это также плохая практика использования number amp;amp; number , когда по крайней мере одно из двух значений может быть 0 связано с тем, что 0 это ложное значение, и в вашей функции любая сумма с 0 в ней приведет к 0 ответу в соответствии с a amp;amp; b проверкой.

Я предлагаю вам просто сделать параметры функции обязательными, чтобы избежать ошибки и избежать hasNumbers проверки:

 function add(a: number, b: number): number {

    return a   b
}