Sobes.tech
Middle

TypeScript görevi: move ve bark metodlarına sahip Animal adlı bir sınıf var ve process fonksiyonu, Animal türünde bir hayvan alıyor ve onun bark metodunu çağırıyor. TypeScript hatası olur mu? Türü nasıl doğru şekilde daraltırsınız? Bir type guard nasıl yazılır?

sobes.tech yapay zeka

AI'dan gelen yanıt

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