Middle
Vaja v TypeScript: obstaja razred Animal z metodami move in bark, funkcija process pa sprejme žival tipa Animal in pokliče njen metod bark. Bo pri tem pri TypeScript prišlo do napake? Kako pravilno zožiti tip? Kako napisati type guard?
sobes.tech AI
Odpoveď od AI
Если у класса Animal есть методы move и bark, а функция process принимает параметр типа Animal и вызывает bark, то ошибки TypeScript не будет, если bark определён в Animal.
Если же bark есть не у всех животных (например, только у собак), и Animal — базовый класс без bark, то будет ошибка, так как метод может отсутствовать.
Чтобы правильно сузить тип и вызвать bark, нужно использовать type guard — функцию, которая проверяет, что объект действительно имеет метод bark.
Пример:
class Animal {
move() {
console.log('Moving');
}
}
class Dog extends Animal {
bark() {
console.log('Woof!');
}
}
function isDog(animal: Animal): animal is Dog {
return (animal as Dog).bark !== undefined;
}
function process(animal: Animal) {
if (isDog(animal)) {
animal.bark(); // теперь безопасно
} else {
console.log('Это не собака');
}
}
const dog = new Dog();
process(dog); // Woof!
const animal = new Animal();
process(animal); // Это не собака
Здесь isDog — type guard, который проверяет наличие метода bark и сужает тип animal до Dog внутри блока if.