AS: A ordem de propriedade do objeto em JS é um tópico muito complicado . Para minhas intenções e propósitos, apenas a ordem de inserção importa.
TL;DR: Existe uma maneira de declarar uma propriedade de objeto em JavaScript sem atribuir um valor a ela, para que, quando a propriedade for definida posteriormente, ela ainda apareça antes na ordem de inserção?
const user = { name: unset, age: 42 }
Tenho um conjunto de funções assíncronas, cada uma retornando um valor associado a uma chave única. Elas são então invocadas em paralelo para construir um objeto com pares chave-valor usados como entradas (propriedades). Algo assim:
const props = {}
const propsSet = getters.map(async ([key, getValue]) => {
props[key] = async getValue()
})
await Promise.all(propsSet)
return props
Como tudo isso é assíncrono, a ordem das propriedades em props
está em todo lugar: às vezes recebo { foo: …, bar: … }
, às vezes { bar: …, foo: … }
. Eu poderia consertar isso associando cada getter a um número de sequência. Mas uma solução muito mais fácil é apenas iniciar as propriedades o mais rápido possível; devido a como o loop de eventos funciona, isso é basicamente uma garantia de que as propriedades de props
serão ordenadas da mesma forma que em getters
:
const propsSet = getters.map(async ([key, getValue]) => {
props[key] = null // or any other initialization token
props[key] = await getValue()
})
Em JS puro, isso é algo perfeitamente normal de se fazer, mas em TypeScript isso geralmente é um erro do compilador (já que um "token de inicialização" arbitrário não pode ser atribuído a propriedades estritamente tipadas de props
); então, tenho que silenciar o compilador, o que não gosto de fazer:
values[key] = null! // non-null assertion operator
Eu preferiria que a propriedade não fosse realmente definida no objeto, mas que um "slot" fosse disponibilizado para ela. Percebi que o que eu basicamente preciso é muito similar a declarar variáveis separadamente de inicializá-las, – como no estilo JS old-school:
var value1, value2
value1 = 42
value2 = 17
Existe alguma maneira existente ou futura (proposta) de declarar propriedades de objetos em JavaScript sem inicializá-los?
Note que não estou perguntando sobre maneiras de ordenar propriedades. Há muitas estratégias para fazer isso, incluindo o uso dos números de sequência mencionados anteriormente (por exemplo, índices de array).