Sobes.tech
Middle

Tarefa de TypeScript: há uma classe Animal com métodos move e bark, e uma função process que aceita um animal do tipo Animal e chama o método bark. Vai haver um erro no TypeScript? Como restringir corretamente o tipo? Como escrever um type guard?

sobes.tech IA

Resposta da 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.