¿Cómo puedo utilizar el encadenamiento opcional con matrices y funciones?
Estoy intentando usar un encadenamiento opcional con una matriz en lugar de un objeto, pero no estoy seguro de cómo hacerlo:
Esto es lo que estoy tratando de hacer myArray.filter(x => x.testKey === myTestKey)?[0]
. También intento algo similar con una función:
let x = {a: () => {}, b: null}
console.log(x?b());
Pero me da un error similar: ¿cómo puedo usar el encadenamiento opcional con una matriz o una función?
Debes poner un .
después de ?
para usar el encadenamiento opcional:
myArray.filter(x => x.testKey === myTestKey)?.[0]
Enlace al patio de juegos
Usar solo el ?
solo hace que el compilador piense que estás intentando usar el operador condicional (y luego arroja un error ya que no ve más :
tarde)
El encadenamiento opcional no es sólo una cuestión de TypeScript: también es una propuesta terminada en JavaScript simple .
Se puede usar con notación entre corchetes como arriba, pero también se puede usar con acceso a la propiedad de notación de puntos:
const obj = {
prop2: {
nested2: 'val2'
}
};
console.log(
obj.prop1?.nested1,
obj.prop2?.nested2
);
Y con llamadas a funciones:
const obj = {
fn2: () => console.log('fn2 running')
};
obj.fn1?.();
obj.fn2?.();
Lo encontré después de buscar un poco en la página de novedades en la documentación oficial.
La forma correcta de hacerlo con una matriz es agregar .
después?
entonces será como
myArray.filter(x => x.testKey === myTestKey)?.[0] // in case of object
x?.() // in case of function
Me gustaría arrojar un poco más de luz sobre lo que sucede exactamente con mi caso de pregunta anterior.
myArray.filter(x => x.testKey === myTestKey)?[0]
Transpila a
const result = myArray.filter(x => x.testKey === myTestKey) ? [0] : ;
Debido a lo cual arroja el error ya que falta algo después de : y probablemente no desee que su código se transfiera a esto.
Gracias a la respuesta de Cierta Performance aprendí cosas nuevas sobre mecanografiado, especialmente la herramienta https://www.typescriptlang.org/play/index.html .
ECMA 262 (2020) que estoy probando en Edge Chromium 84 puede ejecutar el operador de encadenamiento opcional sin el transpilador TypeScript:
// All result are undefined
const a = {};
console.log(a?.b);
console.log(a?.["b-foo-1"]);
console.log(a?.b?.());
// Note that the following statements throw exceptions:
a?.(); // TypeError: a is not a function
a?.b(); // TypeError: a?.b is not a function
CanIUse: Chrome 80+, Firefox 74+