Complementando os demais (que já mostraram como resolver: colocando a expressão entre colchetes), o nome disso é "Computed property names".
Basicamente, se o nome de uma propriedade é dinâmico, precisa estar entre colchetes. Veja a diferença:
const nomePropriedade = 'abc';
// sem colchetes, "nomePropriedade" é literalmente o nome da propriedade
console.log({ nomePropriedade: 1 }); // { nomePropriedade: 1 }
// com colchetes, o nome da propriedade será o valor da variável nomePropriedade
console.log({ [nomePropriedade]: 1 }); // { abc: 1 }
Por isso que no seu caso - como já apontado pelos demais - deveria ser return { [`Dia_${varX}`] :'Choveu' }
.
Vale lembrar que você pode usar qualquer expressão, que o resultado será convertido para string e usado como o nome da propriedade:
const nome = 4;
// resultado da conta é 0.8, que é convertido para string e passa a ser o nome da propriedade
console.log({ [ (nome * 2) / 10 ]: 1 }); // { '0.8': 1 }
function fazAlgo(x) {
return 'algo' + x;
}
console.log({ [ fazAlgo(nome) ]: 1 }); // { algo4: 1 }
const obj = {
toString: function() {
return 'nome qualquer';
}
}
// obj é convertido para string (implicitamente chama obj.toString())
console.log({ [ obj ]: 1 }); // { 'nome qualquer': 1 }
// até mesmo a função é convertida para string
console.log({ [ function () { return 42 } ]: 1 }); // { 'function () { return 42 }': 1 }