Sobes.tech
Middle

TypeScript tapşırığı: move və bark metodlarına malik Animal adlı sinif var və process funksiyası Animal tipində bir heyvan qəbul edir və onun bark metodunu çağırır. TypeScript xətası olacaqmı? Tipi düzgün şəkildə necə daraltmaq olar? Type guard necə yazılır?

sobes.tech Süni İntellekt

AI-dan cavab

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