5

Как подавить ошибку "error TS2533: Object is possibly 'null' or 'undefined'"?

10

У меня есть тип:

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 }, чтобы успокоить компилятор, но это кажется довольно неудобным для большинства нетривиальных случаев.

Как можно или следует решить эту проблему, не отключая проверки компилятора TypeScript?

5 ответ(ов)

0

Чтобы исправить это, вы можете просто использовать восклицательный знак, если вы уверены, что объект не равен null при доступе к его свойству:

list!.values

На первый взгляд некоторые могут перепутать это с оператором безопасной навигации из Angular, но это не так!

list?.values

Запись с ! сообщает компилятору TypeScript, что переменная не равна null, и если это не так, программа崩溃нет во время выполнения.

useRef

Для хука useRef используйте его так:

const value = inputRef?.current?.value
0

Если вы уверены, что переменная типа Bar никогда не будет равна null или undefined, следует объявить её как foo: Bar без знака вопроса. Использование синтаксиса ? Bar означает, что эта переменная потенциально может быть undefined, и вам необходимо будет это проверять.

Другими словами, компилятор выполняет именно то, что вы от него требуете. Если вы хотите, чтобы переменная была опциональной, вам нужно будет делать проверку позже.

0

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

something: null;

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

something: string | null = null;

Убедитесь, что вы объявляете параметры с правильными типами, чтобы избежать подобных ошибок.

0

Вы можете использовать приведение типов как один из вариантов решения проблемы. Если вы получаете эту ошибку от TypeScript, это означает, что какая-то переменная может иметь тип undefined:

let a: string[] | undefined;

let b: number = a.length; // [ts] Объект может быть 'undefined'
let c: number = (a as string[]).length; // все в порядке

Убедитесь, что a действительно существует в вашем коде.

0

Чтобы отключить проверку на наличие значений null и undefined, вызывающую ошибку компиляции 'object is possibly null', вам нужно внести изменения в файл tsconfig.json. Добавьте следующую строку в секцию compilerOptions:

"compilerOptions": {

   // другие правила

   "strictNullChecks": false
}

Обратите внимание, что отключение проверки на null может привести к проблемам в коде, поэтому рекомендуется использовать этот параметр с осторожностью.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь