Come sopprimere l’errore TypeScript “TS2533: L’object è probabilmente ‘null’ o ‘undefined'”?

Ho un tipo:

type tSelectProtected = { handleSelector?: string, data?: tSelectDataItem[], wrapperEle?: HTMLElement, inputEle?: HTMLElement, listEle?: HTMLElement, resultEle?: HTMLElement, maxVisibleListItems?: number } 

Dichiaro un globale – modulo saggio – variabile:

 var $protected : tSelectProtected = {}; 

Sto assegnando il valore corretto in ambito di funzione1:

 $protected.listEle = document.createElement('DIV'); 

Sto chiamando, più tardi, in ambito di funzione2:

 $protected.listEle.classList.add('visible'); 

Ricevo l’errore TypeScript:

 error TS2533: Object is possibly 'null' or 'undefined' 

So che posso fare un controllo esplicito usando if ($protected.listEle) {$protected.listEle} per calmare il compilatore, ma questo sembra essere molto disdicevole per la maggior parte dei casi non banali.

In che modo questa situazione può o deve essere gestita senza disabilitare i controlli del compilatore di TS?

Questa funzione è chiamata “strict null checks”, per distriggersrla assicurarsi che il --strictNullChecks compilatore --strictNullChecks non sia impostato.

Tuttavia, l’esistenza di null è stata descritta come The Billion Dollar Mistake , quindi è emozionante vedere lingue come TypeScript che introducono una correzione. Consiglio vivamente di tenerlo acceso.

Un modo per risolvere questo problema è assicurarsi che i valori non siano mai null o undefined , ad esempio inizializzandoli in anticipo:

 interface SelectProtected { readonly wrapperElement: HTMLDivElement; readonly inputElement: HTMLInputElement; } const selectProtected: SelectProtected = { wrapperElement: document.createElement("div"), inputElement: document.createElement("input") }; 

Se conosci da esterno significa che un’espressione non è null o undefined , puoi usare l’operatore di asserzione non nullo ! per allontanare quei tipi:

 // Error, some.expr may be null or undefined let x = some.expr.thing; // OK let y = some.expr!.thing; 

Se sai che il tipo non sarà mai null o undefined , dovresti dichiararlo come foo: Bar senza il ? . Dichiarare un tipo con il ? Bar ? Bar syntax della ? Bar significa che potrebbe essere potenzialmente indefinito, che è qualcosa che devi controllare.

In altre parole, il compilatore sta facendo esattamente quello che stai chiedendo. Se vuoi che sia facoltativo, dovrai controllarlo in seguito.

Ero solito:

 if (object !== undefined) { // continue - error suppressed when used in this way. } 

In alternativa, è ansible utilizzare la coercizione di tipo:

 const objectX = object as string 

Sebbene, prima di scegliere uno dei metodi sopra descritti, ti preghiamo di considerare l’architettura a cui miri e ha un impatto sul quadro generale.

Questa soluzione ha funzionato per me:

  • vai su tsconfig.json e aggiungi “strictNullChecks”: false

inserisci la descrizione dell'immagine qui

Questo non è il problema dell’OP, ma ho ottenuto lo stesso Object is possibly 'null' messaggio Object is possibly 'null' quando ho dichiarato un parametro come tipo null per errore:

 something: null; 

invece di assegnargli il valore di null:

 something: string = null;