generated at
TypeScriptのreadonly


2種類ある
読み取り専用propertyのためのもの ref
ts
type A = { readonly a: string[] }
immutableな宣言のためのもの ref
ts
type A = { a: readonly string[] }
当然、併用できる
ts
type A = { readonly a: readonly string[] }







readonly , Readonly<T>
readonly と書くのが冗長、というのすごいわかるmrsekut
Readonly でも長い。 RO とか、 DR (DeepReadonly)とかにしても良い気がする
頻出する割に冗長なのが問題
というかコンパイラオプションで基本は全部付ける、とかにして欲しいmrsekut
recordのmutableな変更を避けるために、常にreadonly付きで定義しよう
ts
export type FirstGenre = Readonly<{ type: 'first'; id: GenreId; name: string; }>;
まあ、普段 hoge.x = 2 みたいにrecordに代入することはしないけど、mrsekut
「しないけど」は、いわば運用でカバーなので、型で指定するに越したことはない
tupleからreadonlyを取り除く
引数が配列の時のMapped Types
ts
type 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をつける
引数が配列のときのMapped Types
ts
type A<T> = { readonly [P in keyof T]: T[P]; }; type T = [1, 2, 3, 4]; type U = A<T>; // readonly [1,2,3,4]
Readonly<T>を使えばいい

特に配列の場合は積極的に書くと良いかも

参照が同じものを変更したときに健全性が壊れる
ts
const x: { readonly a: number } = { a: 42 } const y: { a: number } = x y.a = 10 console.log(x) // { a: 10 } 変更されてるし、no error
そうだね