TypeScriptのreadonly
2種類ある
tstype A = { readonly a: string[] }
tstype A = { a: readonly string[] }
当然、併用できる
tstype A = { readonly a: readonly string[] }
readonly
と書くのが冗長、というのすごいわかる

Readonly
でも長い。 RO
とか、 DR
(DeepReadonly)とかにしても良い気がする
頻出する割に冗長なのが問題
というかコンパイラオプションで基本は全部付ける、とかにして欲しい

recordのmutableな変更を避けるために、常にreadonly付きで定義しよう
tsexport type FirstGenre = Readonly<{
type: 'first';
id: GenreId;
name: string;
}>;
まあ、普段
hoge.x = 2
みたいにrecordに代入することはしないけど、

「しないけど」は、いわば運用でカバーなので、型で指定するに越したことはない
tupleからreadonlyを取り除く
tstype A<T> = {
-readonly [P in keyof T]: T[P];
};
type T = readonly [1, 2, 3, 4];
type U = A<T>; // [1,2,3,4]
arrayにreadonlyをつける
tstype A<T> = {
readonly [P in keyof T]: T[P];
};
type T = [1, 2, 3, 4];
type U = A<T>; // readonly [1,2,3,4]
特に配列の場合は積極的に書くと良いかも
参照が同じものを変更したときに健全性が壊れる
tsconst x: { readonly a: number } = { a: 42 }
const y: { a: number } = x
y.a = 10
console.log(x) // { a: 10 } 変更されてるし、no error
そうだね