◆ 扱いやすさ的には { "XX": "YY" } より { type: "XX", value: "YY" } のほうが良い
  ◆ 見やすさは劣るけど
◆ もっといい感じなのが探したけどこれが一番な気がする
  ◆ type なので型にしてみたけどいうほどのメリットなし
  ◆ そのまま JSON 化できるプレーンなオブジェクトなのはかなり大きなメリット

こういうデータ

data = { up: 3 }
data = { down: 4 }

一見わかりやすいです
「3 上げる」という情報や「4 下げる」という情報が伝わります

ただ JavaScript のオブジェクトである以上 別のプロパティ一緒に入れてしまえます

data = { up: 1, down: 3 }

これはどう扱えばいいのでしょうか?
単純に複数のをひとつにまとめたものだとすれば 同じ種類のものが 2 つきたらこうなってしまいます

data = { up: 1, up: 2 }

値としては先にあったほうが上書きされて 2 だけ残ります
同じだった場合に使えないとか分かりづらい制約もでてきますし 2 つのプロパティが一つにまとまっていることに特別意味がないならまとめるべきではないと思います
JavaScript のオブジェクトなら順番も保証されないので 処理の順にも困りますし

ただ 書き方的にできてしまうというのが困るところです

そうなると 複数を書けないようにこういうフォーマットになります

data = { type: "up", value: 1 }

冗長感あって { up: 1 } とかけるほうが好きでしたが プロパティが決まっている方が取り出す方もかんたんです
type と value であればそれらにアクセスするだけですが { up: 1 } のフォーマットではループするしかないです

for (const [type, value] of Object.entries(data)) {
if(type === "up") {
something(value)
}
}

ただ type と value のプロパティというのも普通すぎるし もっと良い方法はないかなぁと考えてたらこういうのを思いつきました
freeze した配列として型名に type を配列の要素に value をいれます
配列の要素なので value が複数にもかんたんに対応できます

const type = (name, size) => class extends Array {
constructor(...a) {
super()
this.name = name
this.push(...a)
this.length = size
Object.freeze(this)
}
}

const X = type("X", 3)
new X()
// [empty × 3, name: "X"]
new X(1,2,3,4)
// [1, 2, 3, name: "X"]

const Up = type("Up", 1)
const value = new Up(3)
value
// [3, name: "Up"]

if (value instanceof Up) {
something(value[0])
}

型名を引数で渡して name プロパティに入れる必要はないのですが devtools のコンソールで見たときにどの型かわからないのが不便だったので入れました
あと型ごとに配列の要素数も固定してますが 足りない部分が undefined なのに代わりはないので なくてもいい気もします

type なので型を作ってコンストラクタ呼び出しでインスタンスを作るようなことしてみましたが JavaScript の場合プレーンなオブジェクトのほうが有利な点が多いです
JSON 化できることはかなり重要です
そうなるとやっぱりこんな変なことするよりも 普通にオブジェクトで type と value プロパティ作るのがベストなのかもしれません

今回のやつのメリットは 型を作ってそのインスタンス作るので type に間違った名前入れるようなことがあると作るタイミングでコンストラクタの関数が見つからないエラーが出るくらいかもしれませんね