Sobes.tech
Middle

TypeScript užduotis: yra Animal klasė su metodais move ir bark, ir funkcija process, kuri priima Animal tipo gyvūną ir iškviečia jo bark metodą. Ar bus TypeScript klaida? Kaip teisingai suvaržyti tipą? Kaip rašyti type guard?

sobes.tech AI

Atsakymas iš 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.