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:
const result = a?.b?.c;
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 ...
var n: number = +myString; // convert to number
var b: bool = !!myString; // convert to bool
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.
(foo||{}).bar;
Así que si foo
es undefined
el resultado es undefined
y si foo
está definido y tiene una propiedad llamada bar
que tiene un valor, el resultado es ese valor.
Pongo un ejemplo en JSFiddle .
Esto se ve bastante incompleto para ejemplos más largos.
var postCode = ((person||{}).address||{}).postcode;
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í).
function chain<T>(exp: () => T, d: T) {
try {
let val = exp();
if (val != null) {
return val;
}
} catch { }
return d;
}
let obj1: { a?: { b?: string }} = {
a: {
b: 'c'
}
};
// 'c'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = {
a: {}
};
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = {};
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = null;
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));