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:
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;