#javascript #reactjs #typescript
Вопрос:
Я создаю приложение с помощью React и TypeScript … Когда я пытаюсь .innerHTML или что-то в тексте, я получаю эту ошибку:
Объект, возможно, «нулевой». TS2531
Я новичок в машинописи и не знаю, что мне делать, я знаю, что это связано с интерфейсом … но я не могу найти конкретного решения.
Если кто-то сможет решить мою проблему с моим кодом, это было бы здорово.
Заранее спасибо. Я позволил своему коду ниже:
const Home: FC = () => {
const percentage = 91;
const startingMinutes = 25;
let time = startingMinutes * 60;
const countdownEl = document.getElementById("countdown");
const updateCountDown = () => {
const minutes = Math.floor(time / 60);
let seconds = time % 60;
countdownEl.innerHTML=`${minutes}: ${seconds}`;
time--;
};
const changeTimer = () => {
var timer = document.getElementById("countdown");
var time = document.getElementById("time");
// timer.innerText=time;
};
Комментарии:
1. Я согласен с @David Remie, кастинг должен быть проведен. Также я думаю, что вы пытаетесь ссылаться на элемент DOM, даже до того, как он будет смонтирован. Попробуйте получить доступ к элементу DOM с помощью ссылки или в крючке useEffect или useLayoutEffect.
Ответ №1:
document.getElementById
теоретически может возвращать значение null, если не существует элемента с заданным идентификатором.
TypeScript достаточно умен, чтобы видеть, что вы не выполняете никакой проверки перед использованием потенциального нулевого объекта, countdownEl.innerHTML=`${minutes}: ${seconds};`
т. Е.
Есть 2 основных способа исправить это:
- Защитите свой код,
if (countdownEl) {}
чтобы убедиться, что соответствующий код выполняется только тогда, когдаcountdownEl
он соответствует действительности. - Явно приведите результат
document.getElementById
if, если «всегда» должно возвращать ненулевое значение, т. е.const countdownEl = document.getElementById("countdown") as HTMLElement;
Ответ №2:
Вам нужно только убедиться, что .innerText
единственное выполняется, когда timer
не равно null, простая инструкция if сделает свое дело. if(timer){timer.innerText = time }