Typescript 3.7@beta Opcional Operador de encadenamiento utilizando problema

3 minutos de lectura

avatar de usuario de muratoner
muratón

Estoy tratando de usar el operador de encadenamiento opcional de TypeScript, pero arrojó esta excepción:

index.ts:6:1 - error TS2779: The left-hand side of an assignment
expression may not be an optional property access.

Mi código de muestra:

const url = URI({
    protocol: 'http',
    hostname: 'example.org' 
})

// This line threw
document.getElementById('output')?.innerHTML = url.toString()

¿Cómo resolver este problema?

objectVariableName!.propertyName="some value to assign";

Tenga en cuenta el símbolo de exclamación, es decir,!

  • ¿Cómo se llama esto? ¿Es esta una implementación de ECMAScript?

    – Dazag

    11 de febrero de 2021 a las 7:29

  • @Dazag Parece que es un operador de aserción no nulo typescriptlang.org/docs/handbook/release-notes/…

    – marca ccp

    23 de febrero de 2021 a las 21:56

  • Esta es una respuesta genial. Ayuda a la legibilidad del código. Gracias

    – Nakamoto

    14 de marzo de 2021 a las 3:28

  • esto es bueno solo si está seguro de que objectVariableName existe, básicamente le dice al compilador que no se preocupe de que esto no esté definido. pero si no está definido obtendrá un error

    – Mordy popa

    22 de marzo de 2021 a las 14:06

  • Entonces, ¿cuál es una alternativa?

    – Gel

    13 de junio de 2022 a las 17:45

avatar de usuario de iamolegga
iamolegga

const output = document.getElementById('output');
if (output) output.innerHTML = url.toString()

Este operador está hecho para acceder a valores anidados profundos.

Miremos a document.getElementById('output')?.innerHTML. esto regresará undefined (si ‘#output’ no existe) o string (si existe ‘#salida’). Y tu tratando de asignar string lo.

Aquí está intentando establecer un nuevo valor para una propiedad de objeto que puede no existir.

Entonces, sí, el acceso a la propiedad opcional no se puede usar en el lado izquierdo de una tarea.

Puedes leer más al respecto en propuesta

  • No creo que los tipos sean el problema aquí, ya que ciertamente puede asignar un valor de tipo string a una variable de escritura o propiedad de tipo string | undefined. el problema es que foo?.bar no se puede escribir en absoluto, ya que es equivalente a foo == null ? undefined : foo.baren el que no puede escribir, incluso con undefined.

    – jcalz

    16 oct 2019 a las 14:31

  • @jcalz, sí, claro, solo intenté explicar de alguna manera que aquí estamos tratando de asignar valor a la propiedad de algún objeto, que puede no existir. actualizado

    – iamolegga

    16 oct 2019 a las 14:41


También puedes solucionar esto con una devolución anticipada:

const output = document.getElementById('output');
if (!output) return;

output.innerHTML = url.toString()

Úselo así para propiedades anidadas:

if (!item?.text) return;

item.text.text = action.payload.text;

https://medium.com/swlh/return-early-pattern-3d18a41bba8

https://softwareengineering.stackexchange.com/questions/18454/should-i-return-from-a-function-early-or-use-an-if-statement

Como se mencionó aquí:

El método Document getElementById() devuelve un Elemento objeto que representa el elemento cuya propiedad id coincide con la cadena especificada.

Si vamos a ver que propiedades el Elemento clase base contiene, verás innerHTML.

Esto significa que es seguro que un instancia de elemento(el resultado de getElementById) tendrá un innerHTML propiedad, por lo que está recibiendo el error.

Esta expresión muy corta me funciona muy bien en TypeScript 4.0.3

let domEl: HTMLElement | null = document.querySelector("#app");
domEl && (domEl.style.color = "green");

Avatar de usuario de Mordy Stern
popa mordy

en ES12 puedes hacer esto con la asignación lógica nula

document.getElementById('output')?.innerHTML ??= url.toString()

por lo que la asignación ocurrirá solo si la expresión de la izquierda no es nula.

esto es como si lo hicieras

if (document.getElementById('output')?.innerHTML) {
  document.getElementById('output').innerHTML = url.toString()
}

Avatar de usuario de Mudassar Mustafai
Mudasar Mustafai

Mi excepción fue:

El lado izquierdo de una expresión de asignación puede no ser un acceso de propiedad opcional.

Recibí este error en mecanografiado “~ 4.6.2” y lo resolví como.

let headingDom : HTMLElement | null = document?.querySelector('h1');
if(headingDom) headingDom.textContent="Hello World";

¿Ha sido útil esta solución?