Dado que TypeScript está fuertemente tipado, simplemente se usa if () {}
para verificar null
y undefined
no suena bien.
¿TypeScript tiene alguna función dedicada o sintaxis de azúcar para esto?
typescript
null-check
David Liu
fuente
fuente
Since TypeScript is strongly-typed
No pude encontrar esto en él de documentos y no tengo dudas al respecto ...Respuestas:
Usando un chequeo de malabarismo, puede probar ambos
null
yundefined
de una sola vez:Si usa una verificación estricta, solo será cierto para los valores establecidos en
null
y no se evaluará como verdadero para las variables indefinidas:Puedes probar esto con varios valores usando este ejemplo:
Salida
fuente
"false" == false
una cadena no vacía como "falso" se evalúatrue
.if(x)
estilo verdadero / falso , pero noif(x == null)
, que solo atrapanull
yundefined
. Verifíquelo usandovar c: number = 0; check(c, 'b');
no es "nully"null
, oundefined
.evaluará
true
sivalue
no es:null
undefined
NaN
''
0
false
El mecanografiado incluye reglas de JavaScript.
fuente
TypeScript comprende completamente la versión de JavaScript que es
something == null
.TypeScript descartará correctamente ambos
null
yundefined
con tales comprobaciones.Más
https://basarat.gitbook.io/typescript/recap/null-undefined
fuente
myVar == null
. Solo otra opción.== null
es la forma correcta de probar nulo e indefinido.!!something
es una coerción inútil en un condicional en JS (solo usosomething
).!!something
también obligará a 0 y '' a falso, que no es lo que desea hacer si está buscando nulo / indefinido.Hice diferentes pruebas en el patio de juegos mecanografiado:
http://www.typescriptlang.org/play/
da:
entonces:
fuente
Creo que esta respuesta necesita una actualización, consulte el historial de edición de la respuesta anterior.
Básicamente, tiene tres casos deferentes nulos, indefinidos y no declarados, vea el fragmento a continuación.
Obtendrá un error que dice que la variable
message
no está definida (también conocida como no declarada), por supuesto, el compilador de Script no debería permitirle hacer eso, pero REALMENTE nada puede impedirlo.El compilador estará encantado de compilar el código anterior. Entonces, si está seguro de que todas las variables están declaradas, simplemente puede hacerlo
el código anterior verificará
null
yundefined
, PERO en caso de que lamessage
variable no esté declarada (por seguridad), puede considerar el siguiente códigoNota: el pedido aquí
typeof(message) !== 'undefined' && message !== null
es muy importante,undefined
primero debe verificar el estado, de lo contrario será el mismo quemessage != null
, gracias @Jaider.fuente
if(typeof something !== 'undefined' && something !== null){...}
En TypeScript 3.7 ahora tenemos encadenamiento opcional y fusión nula para verificar nulos e indefinidos al mismo tiempo, por ejemplo:
este código verificará si foo está definido; de lo contrario, volverá indefinido
antigua manera :
esta:
Con encadenamiento opcional será:
Otra característica nueva es Nullish Coalescing , por ejemplo:
vieja forma:
fuente
Es posible que desee probar
con
!!
.Explicación
El primero
!
convertirá tu expresión en unboolean
valor.Entonces
!someValue
estrue
sisomeValue
es falso yfalse
sisomeValue
es verdadero . Esto puede ser confuso.Al agregar otro
!
, la expresión ahora estrue
sisomeValue
es verdadero yfalse
sisomeValue
es falso , lo cual es mucho más fácil de administrar.Discusión
Ahora, ¿por qué me molesto
if (!!someValue)
cuando algo asíif (someValue)
me hubiera dado el mismo resultado?Porque
!!someValue
es precisamente una expresión booleana, mientras quesomeValue
podría ser absolutamente cualquier cosa. Este tipo de expresión ahora permitirá escribir funciones (y Dios las necesitamos) como:en vez de:
Espero que ayude.
fuente
!!'false'
está hechotrue
porque'false'
es una cadena válidaPara ello
Typescript 2.x.x
, debe hacerlo de la siguiente manera (usando type guard ):tl; dr
¿Por qué?
De esta forma
isDefined()
se respetará el tipo de variable y el siguiente código sabría tener en cuenta este cheque.Ejemplo 1 - verificación básica:
Ejemplo 2 - respeto de tipos:
fuente
es malo! datos
fuente
true
ofalse
solo. Si tiene un valor booleano con unanull
asignación o unundefined
valor, en ambos casos el valor se evaluará comofalse
.Si está utilizando TypeScript, es un mejor enfoque dejar que el compilador verifique si hay valores nulos e indefinidos (o la posibilidad de que existan), en lugar de verificarlos en tiempo de ejecución. (Si desea verificar en tiempo de ejecución, entonces, como indican muchas respuestas, simplemente use
value == null
).Use la opción de compilación
strictNullChecks
para indicarle al compilador que se asfixie ante posibles valores nulos o indefinidos. Si se establece esta opción, y luego hay una situación en la que no desea permitir nula y sin definir, se puede definir el tipoType | null | undefined
.fuente
Si desea pasar
tslint
sin fijarstrict-boolean-expressions
aallow-null-union
oallow-undefined-union
, es necesario el usoisNullOrUndefined
denode
'sutil
módulo o hágalo usted mismo:No es exactamente el azúcar sintáctico, pero es útil cuando las reglas de tslint son estrictas.
fuente
Una notación más rápida y más corta para los
null
controles puede ser:Esta línea es equivalente a:
Especialmente cuando tienes mucho
null
cheque, es una buena notación corta.fuente
Tuve este problema y algunas de las respuestas funcionan bien,
JS
pero estaTS
es la razón.Eso es todo bueno ya que JS no tiene tipos
En TS si la variable no se definió con
null
cuando intenta comprobar quenull
eltslint
| El compilador se quejará.fuente
Tarde para unirse a este hilo, pero encuentro este truco de JavaScript muy útil para verificar si un valor no está definido
fuente
Por lo general, hago el control de malabarismo como Fenton ya discutió . Para que sea más fácil de leer, puede utilizar isNil de Ramda.
fuente
Como forma detallada, si desea comparar valores nulos e indefinidos SOLAMENTE , use el siguiente código de ejemplo como referencia:
Si
incomingValue
no se declara, TypeScript debería devolver una excepción. Si esto se declara pero no se define,console.log()
devolverá "El valor entrante es: indefinido". Tenga en cuenta que no estamos utilizando el operador estricto igual.La forma "correcta" (verifique las otras respuestas para más detalles), si el
incomingValue
no es unboolean
tipo, simplemente evalúe si su valor es verdadero, esto se evaluará de acuerdo con el tipo constante / variable. Unatrue
cadena debe definirse explícitamente como una cadena que utiliza la= ''
asignación. Si no, se evaluará comofalse
. Verifiquemos este caso usando el mismo contexto:fuente
puedes usar
fuente
Todas,
La respuesta con más votos no funciona realmente si está trabajando con un objeto. En ese caso, si una propiedad no está presente, el cheque no funcionará. Y ese fue el problema en nuestro caso: vea esta muestra:
Salir:
enlace plunkr: https://plnkr.co/edit/BJpVHD95FhKlpHp1skUE
fuente
null
. Pruebe esto: plnkr.co/edit/NfiVnQNes1p8PvXd1fCG?p=previewDado que TypeScript es un superconjunto mecanografiado de ES6 JavaScript. Y lodash son una biblioteca de javascript.
El uso de lodash para verificar si el valor es nulo o indefinido se puede hacer usando
_.isNil()
.Argumentos
valor (*): El valor a verificar.
Devoluciones
(booleano) : devuelve verdadero si el valor es nulo, de lo contrario falso.
Ejemplo
Enlace
Docs Lodash
fuente
Tenga cuidado si está usando almacenamiento local, puede terminar con la cadena indefinida en lugar del valor indefinido:
La gente puede encontrar esto útil: https://github.com/angular/components/blob/master/src/cdk/coercion/boolean-property.spec.ts
fuente
Siempre lo escribo así:
Esto funcionará bien y creo que es muy legible.
fuente
0
también pasa la!foo
prueba.undefined
es diferente defalse
. Esto es muy común con los parámetros opcionales de la función booleana, donde debe usar el enfoque común de JavaScript:function fn(flag?: boolean) { if (typeof flag === "undefined") flag = true; /* set default value */ }
var isTrue; if(isTrue)//skips, if(!isTrue)// enters if(isTrue === undefined)//enters
. También lo probé en mecanografiado con elvar isTrue:boolean
que no estaba definido, y lo mismo si se comprueba. @Gingi, ¿hay algo diferente en lo que intentaste y en lo que yo probé?