¿Cómo puedo utilizar el encadenamiento opcional con matrices y funciones?

Resuelto Black Mamba asked hace 4 años • 5 respuestas

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?

Black Mamba avatar Jan 07 '20 14:01 Black Mamba
Aceptado

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
);
Expandir fragmento

Y con llamadas a funciones:

const obj = {
  fn2: () => console.log('fn2 running')
};

obj.fn1?.();
obj.fn2?.();
Expandir fragmento

CertainPerformance avatar Jan 07 '2020 07:01 CertainPerformance

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 .

Black Mamba avatar Jan 07 '2020 07:01 Black Mamba

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+

Luke Vo avatar Aug 16 '2020 19:08 Luke Vo