Sobes.tech
Middle

¿Tarea de TypeScript: hay una clase Animal con métodos move y bark, y una función process que acepta un animal de tipo Animal y llama a su método bark. ¿Habrá un error en TypeScript? ¿Cómo reducir correctamente el tipo? ¿Cómo escribir un type guard?

sobes.tech AI

Respuesta de la IA

Если у класса 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.