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")
};
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.