◆ 7.5 以降で修正されてる

Babel の変換結果がおかしい

Webpack してたもので 動きがおかしい部分がありました
調べてみると getter で値が取れてないようです
ソースを何度確認してもおかしなところはないので Babel の変換を疑って調べてみました

すると {...value} が混ざると getter が消えていることがわかりました
普通の JavaScript では

console.log({ ...{ get foo() { return 1 } }, get bar() { return 2 } })

とした場合に ... で展開される foo はコピーになるので getter は消えます
しかし 普通のプロパティ定義である bar の方は getter となります

▼ { foo: 1 }
bar: (...)
foo: 1
get bar: ƒ bar()
__proto__: Object

これが bar のほうもただの値になっていました

解決方法

ちょっと前にインストールした Babel だったので最新版で直ってないかなぁとアップデートしてみたら直ってました
発生したのは 7.4.4 でアップデートしたのは 7.5.5 です

見た感じでは 7.5 で修正されたようです
https://github.com/babel/babel/blob/v7.5.1/packages/babel-helpers/src/helpers.js#L388-L431

詳しく

どう変わったのか調べてみました
これが Babel を使って変換する処理です

const babel = require("@babel/core")

const code = `
async function fn() {
const value = { a: 1 }
const value2 = { ...value, get aa() { return this.a } }
console.log(value2)
}
fn()
`.trim()

const result = babel.transform(code, {
presets: [
[
"@babel/preset-env",
{
targets: {
ie: "11",
},
},
],
],
}).code

console.log(result)

それぞれのバージョンで出力されたコードを実行した結果をみると

[7.4.4]
{a: 1, aa: undefined}

[7.5.5]
▼ {a: 1}
a: 1
aa: (...)
get aa: ƒ aa()
__proto__: Object

出力されたコードの違いを見ると自動で出力される _objectSpread が変わっていました

[7.4.4]
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }

[7.5.5]
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

フォーマットしたわかりやすいコードは上で貼った URL で見れます
objectSpread2 が 7.5 で追加された新しい方です

なぜ 7.4.4 だと getter が消えるかは 古い方ではオブジェクトに対して すべての key に

defineProperty(target, key, source[key])

を実行するだけなので getter 定義はされずただ値が設定されます
source がオブジェクトで key は名前どおりキーなので property descriptor ではなくただの値です

新しい方では Object.getOwnPropertyDescriptors を使って getter などの情報を含めて設定しているので getter は引き継がれます

Object.defineProperties(target, Object.getOwnPropertyDescriptors(arguments[i]))

ただ引数の順番の i が奇数と偶数で処理がわかれてるので Object.assign みたいなものと違って順番に意味があるみたいです
別に直接つかうことはなくて Babel が中でやってくれてるものだから気にしなくてもよさそうですが 引数的には 1 つめが代入先で 2 つめが単純に代入するもので 3 つめが getter なども含めて代入できるもののようです

今回はアップデートで対応できましたけど 場合によっては気づいたときにはまだ修正されてなくて コード側で対応する必要があることだってあるわけです
やっぱり Babel とか変換系は余計なトラブルのもとなので極力使わないようにしたいですねー