Назначение логического числа с помощью ||оператор - странное поведение - PullRequest
1 голос
/ 03 июня 2019

В соответствии с системой типов машинописи не может быть назначено.

Однако, имея некоторый опыт работы с Javascript, я попробовал следующий пакет кода, и результат для меня довольно неясен:

let booleanVariable: boolean = false;
let numberVariable: number = booleanVariable || 1;
// compiles just fine > numberVariable = 1

Если я должен измениться '|| 1 'до' || 0 ', то возникает ошибка компилятора:

let booleanVariable: boolean = false;
let numberVariable: number = 0 || booleanVariable;
// type false is not assignable to number

Если я хочу изменить 'booleanVariable' на 'true', возникает ошибка компилятора:

let booleanVariable: boolean = true;
let numberVariable: number = booleanVariable|| 1;
// type true is not assignable to type number

И может быть еще больше настроек, если изменить true на false и заменить порядок операндов на '||' оператор. Если бы кто-то мог объяснить такое поведение на основе вышеупомянутых примеров, я был бы очень благодарен.

1 Ответ

2 голосов
/ 03 июня 2019

В следующей строке тип booleanVariable не boolean, а false.

let booleanVariable: boolean = false;

Кажется, что вы не можете увидеть реальный тип, наведя переменную на игровой площадкеили ваша IDE.Но если вам нужно убедиться, вы можете сделать:

const booleanVariable: boolean = false ;
const tmp = booleanVariable; // Here the type of `tmp` is inferred as `false`

Вот как объявить booleanVariable как действительное boolean:

let booleanVariable = false as boolean;

Теперь следующая инструкцияэто ошибка:

let numberVariable: number = booleanVariable || 1; // Error: Type 'true | 1' is not assignable to type 'number'.

В JavaScript 0 равен falsy , тогда выражение 0 || booleanVariable всегда возвращает booleanVariable.Таким образом, TypeScript делает вывод, что тип выражения является типом booleanVariable:

let numberVariable: number = 0 || booleanVariable; // Error: Type 'boolean' is not assignable to type 'number'.
...