Как подавить ошибку "error TS2533: Object is possibly 'null' or '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 }
, чтобы успокоить компилятор, но это кажется довольно неудобным для большинства нетривиальных случаев.
Как можно или следует решить эту проблему, не отключая проверки компилятора TypeScript?
5 ответ(ов)
Чтобы исправить это, вы можете просто использовать восклицательный знак, если вы уверены, что объект не равен null при доступе к его свойству:
list!.values
На первый взгляд некоторые могут перепутать это с оператором безопасной навигации из Angular, но это не так!
list?.values
Запись с !
сообщает компилятору TypeScript, что переменная не равна null, и если это не так, программа崩溃нет во время выполнения.
useRef
Для хука useRef
используйте его так:
const value = inputRef?.current?.value
Если вы уверены, что переменная типа Bar
никогда не будет равна null
или undefined
, следует объявить её как foo: Bar
без знака вопроса. Использование синтаксиса ? Bar
означает, что эта переменная потенциально может быть undefined
, и вам необходимо будет это проверять.
Другими словами, компилятор выполняет именно то, что вы от него требуете. Если вы хотите, чтобы переменная была опциональной, вам нужно будет делать проверку позже.
Это не проблема автора вопроса, но я получил то же сообщение Object is possibly 'null'
, когда случайно объявил параметр как тип null:
something: null;
вместо того, чтобы присвоить ему значение null:
something: string | null = null;
Убедитесь, что вы объявляете параметры с правильными типами, чтобы избежать подобных ошибок.
Вы можете использовать приведение типов как один из вариантов решения проблемы. Если вы получаете эту ошибку от TypeScript, это означает, что какая-то переменная может иметь тип undefined
:
let a: string[] | undefined;
let b: number = a.length; // [ts] Объект может быть 'undefined'
let c: number = (a as string[]).length; // все в порядке
Убедитесь, что a
действительно существует в вашем коде.
Чтобы отключить проверку на наличие значений null
и undefined
, вызывающую ошибку компиляции 'object is possibly null', вам нужно внести изменения в файл tsconfig.json
. Добавьте следующую строку в секцию compilerOptions
:
"compilerOptions": {
// другие правила
"strictNullChecks": false
}
Обратите внимание, что отключение проверки на null
может привести к проблемам в коде, поэтому рекомендуется использовать этот параметр с осторожностью.
Как конвертировать строку в enum в TypeScript?
'unknown' против 'any': в чем разница?
Как получить имена элементов перечисления (enum)?
@Directive против @Component в Angular
Не удается использовать JSX, если не указан флаг '--jsx'