Middle
Задача по TypeScript: има клас Animal с методи move и bark, и функция process, която приема животно от тип Animal и извиква неговия метод bark. Ще има ли грешка в TypeScript? Как правилно да стесните типа? Как да напишете type guard?
sobes.tech AI
Отговор от 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.