#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
}