Ошибка типа: объект, возможно, имеет значение «null». TS2531 для окна.документ

Впервые добавляю Typescript в свой проект.

В одном месте я использовал window.document.getElementById для доступа к чему-то. И это дает эту ошибку.

Type error: Object is possibly 'null'.  TS2531

Я искал в Интернете, но не смог найти лучшее решение для этого. окно никогда не может быть нулевым. Как я могу исправить эту ошибку? Пожалуйста, помогите.

Вы уверены, что window — единственное, что равно нулю?

Jignesh M. Khatri 09.04.2019 11:07

Ааа, теперь есть проблема. это было связано с тем, что элемент может быть нулевым. Спасибо! :D

ghostCoder 09.04.2019 11:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
28
2
52 093
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

window.document.getElementById("foobar");

Либо возвращает HTMLElement, либо null

Как вы могли бы использовать подобное утверждение раньше: window.document.getElementById("foobar").value

Typescript жалуется на то, что это значение может быть недоступно, и вы должны явно проверить это раньше.

Чтобы избежать этого, вы можете сделать следующее:

const element = window.document.getElementById("foobar");

if (element !== null) {
    alert(element.value);
}

запись этого в переменную сработала для меня, так как использование ! это не вариант, потому что это действительно противоречит цели строгого режима. также строгий режим также имеет правило «запрещенное ненулевое утверждение», чтобы остановить использование !

J King 15.02.2021 18:17
Ответ принят как подходящий

ТС делает свою работу и говорит вам, что window.document.getElementById("foobar") МОЖЕТ вернуть то, что есть null.

Если вы абсолютно уверены, что элемент #foobar ДЕЙСТВИТЕЛЬНО существует в вашей DOM, вы можете показать TS свою уверенность с помощью оператора !.

// Notice the "!" at the end of line
const myAbsolutelyNotNullElement = window.document.getElementById("foobar")!

Или вы можете добавить проверку на нулевое значение во время выполнения, чтобы сделать TS счастливым

const myMaybeNullElement = window.document.getElementById("foobar")

myMaybeNullElement.nodeName // <- error!

if (myMaybeNullElement === null) {
  alert('oops');
} else {
  // since you've done the nullable check
  // TS won't complain from this point on
  myMaybeNullElement.nodeName // <- no error
}

Спасибо! ТС выдавал верную ошибку. Я просто не понял, что это было для элемента, а не для окна.

ghostCoder 09.04.2019 11:42

Typescript жалуется, что объект, результат выполнения window.document.getElementById в вашем случае, может быть нулевым.

Это можно отключить с помощью флага strictNullChecks в вашем tsconfig.json, что я не рекомендую.

В качестве альтернативы вы можете выполнять проверки, предложенные в других ответах, или, начиная с Typescript 3.7, использовать синтаксис Необязательная цепочка, чтобы сделать ваш код более кратким:

obj?.doSometething(); //good, will not do something.
obj?.prop = 'plop'; //not good because it does not work with assignments.

Добавь это. ( ? ) в массиве, Пример:

form.get('description')?.errors

Здесь вы должны убедиться, что ваш window.document.getElementById("id_name")! установлен. Вы можете попробовать это

const element = window.document.getElementById("id_name");

if (element){
console.info(element);
}

Это потому, что вы должны установить тип.

const checkbox = document.getElementById("toggleFilter") as HTMLInputElement
checkbox.checked = true

Другие вопросы по теме