Tengo un type
:
type tSelectProtected = {
handleSelector?: string,
data?: tSelectDataItem[],
wrapperEle?: HTMLElement,
inputEle?: HTMLElement,
listEle?: HTMLElement,
resultEle?: HTMLElement,
maxVisibleListItems?: number
}
Declaro una variable global en cuanto a módulos:
var $protected : tSelectProtected = {};
Estoy asignando el valor adecuado en el function1()
alcance:
$protected.listEle = document.createElement('DIV');
Más adelante en el function2()
alcance, estoy llamando:
$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 puede o debe manejarse esta situación sin deshabilitar las comprobaciones del compilador de TS?
fuente
null
s en JavaScript "vainilla" para inicializar variables o valores de propiedades. Esto me da una respuesta directa si existe var o prop dado, pero todavía no tiene "ningún valor utilizable" o "el valor se borró en algún momento de la ejecución". Es solo por convención. Este puede no ser el mejor enfoque en TypeScript, como puedo ver en las respuestas aquí. Gracias por tus pensamientos.null
?!
operador disponible, muy similar a los de Kotlin que le permite hacer estas comprobaciones mucho más concisasSi sabe por medios externos que una expresión no es
null
oundefined
, puede usar el operador de aserción no nulo!
para forzar esos tipos:fuente
! - Non-null assertion operator
operador. Parece que la cosa aún no está bien documentada ( https://github.com/Microsoft/TypeScript/issues/11494 ), por lo que cualquiera que busque respuestas lea este http://stackoverflow.com/questions/38874928/operator-in-typescript -after-object-method!
operador aquí no hace lo mismo que?
en C #! Es solo una aserción del sistema de tipos ; no hará que su programa no se bloquee cuando intente leer una propiedad denull
oundefined
.!
:identifier!
eliminanull
yundefined
del tipo deidentifier
Esto es lo que Ryan ya dijo, pero también me parece útil.Solía:
Alternativamente, puede usar la coerción de tipo:
Aunque, antes de elegir una de las soluciones anteriores, considere la arquitectura a la que apunta y su impacto en el panorama general.
fuente
if(object!==undefined) object.function();
null
yundefined
, y no es una mala práctica (solo si se usa con esos dos tipos): el evento TSLint le permitirá hacerlo. Facilita verificar si algo está definido porque en lugar de escribirnull !== someObject && undefined !== someObject
puedes usar solonull != someObject
No es una respuesta directa a la pregunta del OP, pero en mi caso, tuve la siguiente configuración:
Letra de imprenta -
v3.6.2
tslint -
v5.20.0
Y usando el siguiente código
Seguí suprimiendo el compilador para esa línea. Tenga en cuenta que, dado que es un error del compilador y no el error de linter,
// tslint:disable-next-line
no funcionó. Además, según la documentación, esto debe usarse raramente, solo cuando sea necesario :ACTUALIZACIÓN :
Con Typecript 3.7, puede usar el encadenamiento opcional para resolver el problema anterior como:
fuente
strictNullChecks
, se debe tener precaución con esto, la mayoría de las veces se desea el error de referencia nula porque puede causar dolores de cabeza reales en el futuro.const input = useRef<HTMLInputElement>(null);
eif (input && input.current) { input.current.value = ''; }
hizo el truco.Esta solución funcionó para mí:
fuente
as
100% seguro. Obtuve el caso con mongodb y el valor de retorno FindOneOrUpdate y tuve que enviarlo al esquema porqueresult.value
se declara comoTSchema | undefined
y ya lo he consultadoresult.ok
antesSi sabe que el tipo nunca será
null
oundefined
, debe declararlofoo: Bar
sin el?
. Declarar un tipo con la? Bar
sintaxis significa que podría estar indefinido, lo cual 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.
fuente
Este no es el problema del OP, pero recibí el mismo
Object is possibly 'null'
mensaje cuando había declarado un parámetro como el tipo nulo por accidente:en lugar de asignarle el valor nulo:
fuente
Object is possibly 'null'
error. Esta respuesta resuelve eso.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:
Asegúrese de que
a
realmente exista en su código.fuente
A partir de TypeScript 3.7 ( https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html ), ahora puede usar el
?.
operador para obtener una definición indefinida al acceder a un atributo (o llamar a un método ) en un objeto nulo o indefinido:fuente
?.
.Consejo para RxJS
A menudo tendré variables de tipo de miembro
Observable<string>
, y no lo inicializaré hastangOnInit
(usando Angular). Luego, el compilador supone que no está inicializado porque no está 'definitivamente asignado en el constructor', y el compilador nunca lo va a entenderngOnInit
.Puede usar el
!
operador de aserción en la definición para evitar el error: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 va a ser puesto en algo asíngOnInit
, pero puede haber casos en los que el valor se establece de alguna otra manera menos determinista.Entonces, una alternativa que a veces usaré es:
Donde
uninitialized
se define globalmente en algún lugar como:Luego, si alguna vez usa esta secuencia sin que esté definida, arrojará inmediatamente un error de tiempo de ejecución.
fuente
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:
fuente
Me encontré con esto con React cuando configuré el estado y lo usé
map
.En este caso, estaba haciendo una llamada de recuperación de API y el valor de la respuesta no se conocía, pero debería tener el valor "Respuesta". Usé un tipo personalizado para esto, pero porque el valor podría ser
null
, obtuve un error TS de todos modos. Permitir que el tipo seanull
no lo arregla; alternativamente, podría usar undefault parameter value
, pero esto fue complicado para mi caso.Lo superé al proporcionar un valor predeterminado en el caso de que la respuesta estuviera vacía con solo usar un operador ternario:
fuente
En mecanografiado puede hacer lo siguiente para suprimir el
error
:subString > !null;
- Tenga en cuenta el signo de exclamación agregado antes de nulo.fuente
Intenta llamar a un objeto como este:
Este error se produjo porque los ha declarado como opcionales usando
?
. Ahora Typecript realiza una verificación estricta y no permitirá hacer nada que pueda serundefined
. Por lo tanto, puedes usar(<any>yourObject)
aquí.fuente