Back to questions
Middle
6
Задача по TypeScript: есть класс Animal с методами move и bark, функция process принимает animal типа Animal и вызывает у него метод bark. Будет ли ошибка TypeScript? Как правильно сузить тип? Как написать type guard?
Companies where asked
Цифротех
Answer from AI
sobes.tech 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.