ふとタプル・レコードってどうなってるんだろうと見てみました
https://github.com/tc39/proposal-record-tuple
構文は
#{}
#[]
らしいです
短く書ける点ではいいですが見た目的にはなんか微妙です
個人的には
{| |}
[| |]
が良かったです
構文の議論はかなり長く続いていて {| |} も提案されていて賛成も多いようなのですが #{} に決めたようです
その他の提案だと既存を壊すとかパーサの問題とかあるようですが これは明確にダメと言う理由もなく好みの問題で選ばれなかったみたいです
https://github.com/tc39/proposal-record-tuple/issues/10
1 行で複雑にネストされたら見づらいという意見がありますが #{} だって見づらいし変わらないと思うのですけどね
重要なのは末尾との対称性であって 数十行と続く長いデータがネストするとき 末尾だけでなにかわかるほうがメリットがあると思うんです
「}」 だったら if などのブロックもオブジェクトも関数も同じなのでどのカッコなのかわかりづらいですし
# が見やすいというなら
{# #}
[# #]
でもいいと思います
また ネストする場合は明示的にすべての階層で # を書かないとだめのようです
#{ a: 1, b: #{ c: 2 } }
「{| |}」 形式なら 外と内で形式違うのは気持ち悪いのでそれでもいいと思います
{| a: 1, b: { c: 2 } |}
{| a: 1, b: {| c: 2 |} |}
ですが # プレフィックスだと
#(
{ a: 1, b: { c: 2 } }
)
みたいに プレフィックスとオブジェクト部分で分けて見れるので # のあとは普通のオブジェクト形式で書けばいいとしてもいいと思うのですけどね
#{ a: 1, b: { c: 2 } }
あと結構不便そうな部分でプリミティブ値しか含められないそうです
こういうことはできません
const obj = { a: 1 }
const r1 = #{ obj }
const r2 = #{ obj }
r1 === r2 // true
レコードの obj プロパティが固定であれば obj の中身が変更できても r1 と r2 が等しいことに変わりはなく === で比較できるので この制限はいらないと思います
あとそもそもの レコード・タプルの不変という部分ですが 使う側で不便になりそうかもとも思ってます
すでにクラスのプライベートプロパティで 外から読み書きできないものがあります
これが使われてるライブラリを使うときに デバッグしづらいし 外から読み書きが必要なのにできないし 実行時の書き換えで対応できずライブラリを直接書き換えるしかなくてすごく使いづらいです
レコードもライブラリがこの型で持たれていると使う側で無理やり書き換えて対処したいところでできないという不便なケースが出てきそうです
JavaScript はその辺がゆるくソースコードを変えなくても実行時に無理やり置き換えて対処できるのが良いところでもあるのに それができなくなるのはデメリットでもあるように思います
使う側でその辺のゆるさを設定できればいいのですけどね