¿TypeScript actualmente (o hay planes para) apoyar al operador de navegación segura de?.
es decir:
var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : null;
Además, ¿hay un nombre más común para este operador?
typescript
Marty Pitt
fuente
fuente
property ?? property2
, pero si lo intentarasproperty.company ?? property1.company
yproperty
fue nulo, obtendrías unNullReferenceException
Respuestas:
Actualización : es compatible a partir de TypeScript 3.7 y se llama Encadenamiento opcional : https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining
No puedo encontrar ninguna referencia al respecto en la especificación del lenguaje TypeScript .
En cuanto a cómo llamar a este operador en CoffeeScript, se llama operador existencial (específicamente, la "variante de acceso" del operador existencial).
De la documentación de CoffeeScript sobre operadores :
Entonces, la variante de acceso del operador existencial parece ser la forma correcta de referirse a este operador; y TypeScript actualmente no parece admitirlo (aunque otros han expresado su deseo de esta funcionalidad ).
fuente
¿No es tan bueno como un single ?, pero funciona:
Puede usar tantos && como desee:
fuente
Esto se define en la especificación de encadenamiento opcional ECMAScript, por lo que probablemente deberíamos referirnos al encadenamiento opcional cuando discutimos esto. Implementación probable:
En resumidas cuentas, el equipo de TypeScript está esperando que la especificación ECMAScript se ajuste, por lo que su implementación puede ser ininterrumpida en el futuro. Si implementaran algo ahora, terminaría necesitando cambios importantes si ECMAScript redefine su especificación.
Ver especificación de encadenamiento opcional
Cuando algo nunca va a ser JavaScript estándar, el equipo de TypeScript puede implementarlo como mejor les parezca, pero para futuras adiciones de ECMAScript, desean preservar la semántica incluso si otorgan acceso temprano, como lo han hecho para muchas otras características.
Cortes Cortos
Por lo tanto, todos los operadores funky de JavaScripts están disponibles, incluidas las conversiones de tipo como ...
Solución manual
Pero volviendo a la pregunta. Tengo un ejemplo obtuso de cómo puedes hacer algo similar en JavaScript (y, por lo tanto, TypeScript), aunque definitivamente no estoy sugiriendo que sea una función elegante como la que realmente buscas.
Así que si
foo
esundefined
el resultado esundefined
y sifoo
está definido y tiene una propiedad llamadabar
que tiene un valor, el resultado es ese valor.Pongo un ejemplo en JSFiddle .
Esto se ve bastante incompleto para ejemplos más largos.
Función de cadena
Si está desesperado por una versión más corta mientras la especificación aún está en el aire, en algunos casos utilizo este método. Evalúa la expresión y devuelve un valor predeterminado si la cadena no puede satisfacerse o termina siendo nula / indefinida (tenga en
!=
cuenta que aquí es importante, no queremos usarla!==
ya que queremos un poco de malabares positivos aquí).fuente
(this.loop || {}).nativeElement
diciendoProperty 'nativeElement' does not exist on type '{}'. any
this.loop
typeof angular.io/api/core/ElementRef{}
, o 2) usar una aserción de tipo para silenciar el compilador.foo
es un objeto útil real:(foo || {}).bar
generalmente no se compilará en mecanografiado porque{}
no será del mismo tipo quefoo
. Ese es el problema que la solución de @ VeganHunter pretende evitar.Actualización: ¡Sí, es compatible ahora!
Acaba de ser lanzado con TypeScript 3.7: https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/
Se llama encadenamiento opcional : https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/#optional-chaining
Con ella lo siguiente:
es equivalente a:
Vieja respuesta
Hay una solicitud de función abierta para esto en github donde puede expresar su opinión / deseo: https://github.com/Microsoft/TypeScript/issues/16
fuente
¡Edite el 13 de noviembre de 2019!
A partir del 5 de noviembre de 2019, se envió TypeScript 3.7 y ahora es compatible con
?.
el operador de encadenamiento opcional 🎉🎉🍾🍾🎉 !!!https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining
Solo para fines históricos:
Editar: He actualizado la respuesta gracias al comentario fracz.
TypeScript 2.0 lanzado
!.
No es lo mismo que?.
(Safe Navigator en C #)Vea esta respuesta para más detalles:
https://stackoverflow.com/a/38875179/1057052
Esto solo le dirá al compilador que el valor no es nulo o no está definido. Esto no verificará si el valor es nulo o no está definido.
Operador de aserción no nulo de TypeScript
fuente
?
porque afirma que el valor está definido.?
se espera que falle silenciosamente / evalúe a falso. De todos modos, es bueno saberlo.El operador de encadenamiento opcional Elvis (?.) Es compatible con TypeScript 3.7.
Puede usarlo para verificar valores nulos:
cats?.miows
devuelve nulo si cats es nulo o no está definido.También puede usarlo para llamar a métodos opcionales:
cats.doMiow?.(5)
llamará a doMiow si existe.El acceso a la propiedad también es posible:
cats?.['miows']
.Referencia: https://devblogs.microsoft.com/typescript/announcing-typescript-3-7-beta/
fuente
?:
. Tiene una referencia?El operador
?.
no es compatible con TypeScript versión 2.0 .Entonces uso la siguiente función:
el uso se ve así:
Además, puede establecer un valor predeterminado:
Funciona muy bien con IntelliSense en Visual Studio.
fuente
elvis<T>
;-)¡Finalmente está aquí!
Aquí están algunos ejemplos:
Pero no funciona exactamente igual que su suposición.
En lugar de evaluar
a este pequeño fragmento de código todos estamos acostumbrados a escribir
en realidad se evalúa a
que funciona para todos los valores de falsey como una cadena vacía, 0 o falso.
Simplemente no tengo una explicación de por qué no lo compilan para
foo == null
fuente
Creamos este método de utilidad mientras trabajamos en Phonetradr que puede brindarle acceso seguro a las propiedades profundas con Typecript:
fuente
return this.entry.fields.featuredImage.fields.file.url;
En general, no recomiendo este enfoque (tenga cuidado con las preocupaciones de rendimiento), pero puede usar el operador de propagación para clonar superficialmente un objeto, al que luego puede acceder a la propiedad.
Esto funciona porque el tipo de 'nombre' se 'propaga' a través.
Usaré esto con más frecuencia cuando tenga una
find(...)
expresión que pueda devolver nulo y necesite una sola propiedad:Puede haber algunos casos extremos con la forma en que el mecanografiado infiere tipos y esto no se compilará, pero esto generalmente debería funcionar.
fuente
Se llama encadenamiento opcional y está en Typecript 3.7
fuente
Como se respondió anteriormente, actualmente todavía se está considerando, pero ya lleva varios años muerto en el agua .
Sobre la base de las respuestas existentes, aquí está la versión manual más concisa que se me ocurre:
jsfiddle
Simplemente falla silenciosamente cuando faltan errores de propiedad. Recurre a la sintaxis estándar para determinar el valor predeterminado, que también se puede omitir por completo.
Aunque esto funciona para casos simples, si necesita cosas más complejas, como llamar a una función y luego acceder a una propiedad en el resultado, también se tragan otros errores. Mal diseño
En el caso anterior, una versión optimizada de la otra respuesta publicada aquí es la mejor opción:
jsfiddle
Un ejemplo más complejo:
También puede ir hacia otro lado y usar algo como Lodash '
_.get()
. Es conciso, pero el compilador no podrá juzgar la validez de las propiedades utilizadas:fuente
Todavía no (a partir de septiembre de 2019), pero dado que el "operador de navegación segura" se encuentra ahora en la Etapa 3 , se está implementando en TypeScript.
Mire este número para actualizaciones:
https://github.com/microsoft/TypeScript/issues/16
Varios motores tienen implementaciones tempranas:
JSC: https://bugs.webkit.org/show_bug.cgi?id=200199
V8: https://bugs.chromium.org/p/v8/issues/detail?id=9553
SM: https://bugzilla.mozilla.org/show_bug.cgi?id=1566143
(a través de https://github.com/tc39/proposal-optional-chaining/issues/115#issue-475422578 )
Puede instalar un complemento para admitirlo ahora:
En tu tsconfig.json:
Espero que esta respuesta esté desactualizada en los próximos 6 meses más o menos, pero espero que mientras tanto ayude a alguien.
fuente
_.get(obj, 'address.street.name')
funciona muy bien para JavaScript donde no tienes tipos. ¡Pero para TypeScript necesitamos el verdadero operador de Elvis!fuente