operator nodejs example español ejemplos typescript

nodejs - ¿Cómo suprimir el “error TS2533 de TypeScript: el objeto es posiblemente ''nulo'' o ''indefinido''”?



typescript version (11)

Consejo para RxJS

A menudo tendré variables miembro de tipo Observable<string> , y no lo inicializaré hasta ngOnInit (usando Angular). Luego, el compilador supone que no está inicializado porque no está ''definitivamente asignado en el constructor'', y el compilador nunca va a entender ngOnInit .

Puedes usar el ! operador de aserción en la definición para evitar el error:

favoriteColor!: Observable<string>;

Un observable no inicializado puede causar todo tipo de problemas de tiempo de ejecución con errores como "debe proporcionar una secuencia pero proporcionó nulo". El ! está bien si definitivamente sabe que se establecerá en algo como ngOnInit , pero puede haber casos en los que el valor se establezca de alguna otra manera menos determinista.

Entonces, una alternativa que a veces usaré es:

public loaded$: Observable<boolean> = uninitialized(''loaded'');

Donde uninitialized se define globalmente en alguna parte como:

export const uninitialized = (name: string) => throwError(name + '' not initialized'');

Luego, si alguna vez usa esta secuencia sin que esté definida, arrojará inmediatamente un error de tiempo de ejecución.

Tengo un tipo:

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

Declaro una variable global de módulo inteligente:

var $protected : tSelectProtected = {};

Estoy asignando el valor adecuado en el alcance de function1:

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

Llamo, más adelante, en el alcance de la función2:

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

Recibo un error de TypeScript:

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

Sé que puedo hacer una verificación explícita usando if ($protected.listEle) {$protected.listEle} para calmar el compilador, pero esto parece ser muy desagradable para la mayoría de los casos no triviales.

¿Cómo se puede o se debe manejar esta situación sin deshabilitar las comprobaciones del compilador de TS?


Como opción, puede usar un tipo de conversión. Si tiene este error de mecanografiado, eso significa que alguna variable tiene tipo o no está definida:

let a: string[] | undefined; let b: number = a.length; // [ts] Object is possibly ''undefined'' let c: number = (a as string[]).length; // ok

Asegúrese de que realmente exista un en su código.


En ReactJS, verifico en el constructor si las variables son nulas, si lo son, lo trato como una excepción y gestiono la excepción de manera adecuada. Si las variables no son nulas, el código continúa y el compilador ya no se queja después de ese punto:

private variable1: any; private variable2: any; constructor(props: IProps) { super(props); // i.e. here I am trying to access an HTML element // which might be null if there is a typo in the name this.variable1 = document.querySelector(''element1''); this.variable2 = document.querySelector(''element2''); // check if objects are null if(!this.variable1 || !this.variable2) { // Manage the ''exception'', show the user a message, etc. } else { // Interpreter should not complain from this point on // in any part of the file this.variable1.disabled = true; // i.e. this line should not show the error }


En mecanografiado puede hacer lo siguiente para suprimir el error :

let subString?: string;

subString > !null; - Tenga en cuenta el signo de exclamación agregado antes de nulo.


Esta característica se denomina "comprobaciones nulas estrictas", para desactivarla asegúrese de que el --strictNullChecks compilador --strictNullChecks no esté configurado.

Sin embargo, la existencia de null se ha descrito como El error del billón de dólares , por lo que es emocionante ver lenguajes como TypeScript que introducen una solución. Recomiendo encarecidamente mantenerlo encendido.

Una forma de solucionar esto es asegurarse de que los valores nunca sean null o undefined , por ejemplo, inicializándolos por adelantado:

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


Esta solución funcionó para mí:

  • vaya a tsconfig.json y agregue "strictlyNullChecks": falso


Este no es el problema del OP, pero recibí el mismo Object is possibly ''null'' mensaje Object is possibly ''null'' cuando declare un parámetro como tipo nulo por accidente:

something: null;

en lugar de asignarle el valor nulo:

something: string = null;


Me encontré con esto con React al configurar el estado y usar el map .

En este caso, estaba haciendo una llamada de recuperación de API y no se conocía el valor de la respuesta, pero debería tener el valor "Respuesta". Utilicé un tipo personalizado para esto, pero debido a que el valor podría ser null , recibí un error de TS de todos modos. Permitir que el tipo sea null no lo arregla; alternativamente, podría usar un default parameter value , pero esto fue complicado para mi caso.

Lo superé al proporcionar un valor predeterminado en caso de que la respuesta estuviera vacía simplemente usando un operador ternario:

this.setState({ record: (response.Answer) ? response.Answer : [{ default: ''default'' }] });


Si sabe por medios externos que una expresión no es null o undefined , ¡puede usar el operador de aserción no nulo ! para forzar esos tipos:

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


Si sabe que el tipo nunca será null o undefined , debe declararlo como foo: Bar sin el ? . Declarando un tipo con el ? Bar ? Bar sintaxis de ? Bar significa que podría estar indefinido, que es algo que debe verificar.

En otras palabras, el compilador está haciendo exactamente lo que le pides. Si desea que sea opcional, deberá verificarlo más tarde.


Solía:

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

Alternativamente, puede usar la coerción de tipo:

const objectX = object as string

Aunque, antes de elegir una de las soluciones anteriores, considere la arquitectura a la que apunta y su impacto en el panorama general.