Как подавить 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 56

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

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

Это решение работало для меня:

  • на tsconfig.json и добавить "strictNullChecks": false

enter image description here

это не проблема ОП, но я получил то же самое Object is possibly 'null' сообщение, когда я случайно объявил параметр как тип null:

something: null;

вместо того, чтобы присваивать ей значение null:

something: string = null;