Как подавить TypeScript " ошибка TS2533: объект, возможно, 'null' или 'undefined'"?
у меня есть типа:
type tSelectProtected = {
handleSelector?: string,
data?: tSelectDataItem[],
wrapperEle?: HTMLElement,
inputEle?: HTMLElement,
listEle?: HTMLElement,
resultEle?: HTMLElement,
maxVisibleListItems?: number
}
Я объявляю глобальную модульную переменную:
var $protected : tSelectProtected = {};
я присваиваю правильное значение в области function1:
$protected.listEle = document.createElement('DIV');
Я вызываю, позже, в области function2:
$protected.listEle.classList.add('visible');
Я получаю ошибку TypeScript:
error TS2533: Object is possibly 'null' or 'undefined'
Я знаю, что я могу сделать явную проверку, используя if ($protected.listEle) {$protected.listEle}
чтобы успокоить компилятор, но это кажется очень неудобным для большинства нетривиальных случаев.
как эта ситуация может или следует обрабатывать без отключения проверки компилятора TS?
6 ответов:
эта функция называется "строгие нулевые проверки", чтобы отключить его убедитесь, что
--strictNullChecks
флаг компилятора не указан.однако, наличие
null
и описаны как Ошибка На Миллиард Долларов, так что это интересно видеть языки, такие как TypeScript вводя исправление. Я настоятельно рекомендую держать его включенным.один из способов исправить это, чтобы убедиться, что значения никогда не
null
илиundefined
, например инициализация их спереди:interface SelectProtected { readonly wrapperElement: HTMLDivElement; readonly inputElement: HTMLInputElement; } const selectProtected: SelectProtected = { wrapperElement: document.createElement("div"), inputElement: document.createElement("input") };
если вы знаете из внешних средств, что выражение не
null
илиundefined
, вы можете использовать ненулевой оператор утверждения!
чтобы вытеснить эти типы:// Error, some.expr may be null or undefined let x = some.expr.thing; // OK let y = some.expr!.thing;
если вы знаете тип никогда не будет
null
илиundefined
, вы должны объявить его какfoo: Bar
без?
. Объявление типа с помощью? Bar
синтаксис означает, что он потенциально может быть неопределенным, что-то нужно проверить.другими словами, компилятор делает именно то, что вы просите его. Если вы хотите, чтобы это было необязательно, вам нужно будет проверить позже.
Я:
if (object !== undefined) { // continue - error suppressed when used in this way. }
в качестве альтернативы, вы можете использовать тип принуждения:
const objectX = object as string
хотя, прежде чем выбрать один из вышеуказанных обходных путей, пожалуйста, рассмотрите архитектуру, к которой вы стремитесь, и это повлияет на общую картину.