Здравствуйте.
Вот есть псевдокод на котором хочу понять, что происходит не так:
import { Ref, ref } from 'vue';
class Enemy {
x = ref(0);
y = ref(0);
hp = ref(100);
}
class Enemies {
enemies: Ref<Array<Enemy>> = ref([]);
addEnemy = () => {
this.enemies.value.push(new Enemy());
};
moveEnemies = () => {
this.enemies.value.forEach((enemy) => {
if (enemy.hp > 0) {
enemy.x += 1;
}
});
};
}
const enemies = new Enemies();
enemies.addEnemy();
enemies.moveEnemies();
Почему при переборе объектов в методе moveEnemies через forEach, когда я обращаюсь к enemy.x, не требуется указывать value? Вот так:
this.enemies.value.forEach((enemy) => {
if (enemy.hp.value > 0) {
enemy.x.value += 1;
}
});
Код
без value работает, но TS ругается на типы, поскольку enemy.x является Ref и нельзя ему присвоить новое число или выполнять операции математические.
И если допустим проверку if (enemy.hp > 0) я могу пройти, добавив защиту через toValue(enemy.hp), то вот с присваиванием enemy.x — не могу.
this.enemies.value.forEach((enemy) => {
if (toValue(enemy.hp) > 0) {
enemy.x += 1;
}
});
Конечно, можно добавить gett'er к объекту enemy, либо просто метод, записывающий в x.value значение. Но хочется разобраться, что я упускаю