Предположим, у нас есть тип объединения, который представляет одно из трех различных строковых значений.
type Animal = 'bird' | 'cat' | 'dog';
Теперь я хотел бы создать собаку и проверить, что это за животное, чтобы создать правильный шум, который оно издает.
let oscar: Animal = 'dog';
switch (oscar) {
case 'bird':
console.log('tweet');
break;
case 'cat':
console.log('meow');
break;
case 'dog':
console.log('bark');
break;
}
Этот код приведет к ошибке TypeScript: Type '"bird"' is not comparable to type '"dog"'.ts(2678)
(аналог cat). Однако, если я использую явное приведение типа к переменной oscar
, он работает без проблем:
switch (oscar as Animal) {
case 'bird':
...
case 'cat':
...
case 'dog':
...
}
Не могли бы вы объяснить мне, почему первые два оператора switch не работают, если я использую явное значение для oscar
?
Я мог бы понять ошибку, если бы объявил Оскар константой: const oscar = 'dog';
, потому что в этом случае это всегда будет собака и ничего больше. Однако представьте на мгновение, что Оскар мог бы превратиться в кота, если бы волшебник совершил определенное заклинание:
let oscar: Animal = 'dog';
while(true) {
switch (oscar) {
case 'bird':
...
case 'cat':
...
case 'dog':
console.log('bark');
// here comes the wizard
if(wizard.performsSpell('makeOscarBecomeACat')) {
oscar = 'cat'; // that should be valid, because oscar is of type Animal
}
break;
}
}
Я что-то неправильно понимаю в назначении переменной oscar
, или это просто ошибка TypeScript?