TypeScriptのreadonly
2種類ある
読み取り専用propertyのためのもの ref
code:ts
type A = { readonly a: string[] }
immutableな宣言のためのもの ref
code:ts
type A = { a: readonly string[] }
当然、併用できる
code:ts
type A = { readonly a: readonly string[] }
#WIP
https://zenn.dev/okunokentaro/articles/01gmm9sgd9j8rab0rgj0tsy6wq
readonly, Readonly<T>
https://qiita.com/uhyo/items/0fd033ff1aed9b4b32dd
readonlyと書くのが冗長、というのすごいわかるmrsekut.icon
Readonlyでも長い。ROとか、DR(DeepReadonly)とかにしても良い気がする
頻出する割に冗長なのが問題
というかコンパイラオプションで基本は全部付ける、とかにして欲しいmrsekut.icon
https://susisu.hatenablog.com/entry/2021/10/31/233246#covariant-properties
recordのmutableな変更を避けるために、常にreadonly付きで定義しよう
code:ts
export type FirstGenre = Readonly<{
type: 'first';
id: GenreId;
name: string;
}>;
まあ、普段hoge.x = 2みたいにrecordに代入することはしないけど、mrsekut.icon
「しないけど」は、いわば運用でカバーなので、型で指定するに越したことはない
tupleからreadonlyを取り除く
引数が配列の時のMapped Types
code:ts
type A<T> = {
-readonly P in keyof T: TP;
};
type T = readonly 1, 2, 3, 4;
type U = A<T>; // 1,2,3,4
arrayにreadonlyをつける
引数が配列のときのMapped Types
code:ts
type A<T> = {
readonly P in keyof T: TP;
};
type T = 1, 2, 3, 4;
type U = A<T>; // readonly 1,2,3,4
Readonly<T>を使えばいい
https://zenn.dev/rizzzse/articles/57f33e51961bd4?utm_source=pocket_mylist#readonlyの消失
特に配列の場合は積極的に書くと良いかも
TypeScriptのArrayはinvariantではなくcovariantなので健全性が壊れている
https://azukiazusa.dev/blog/q-typescript-readonly-shorts/
https://qiita.com/aiya000/items/65e31b02ca543b7c15df
参照が同じものを変更したときに健全性が壊れる
code:ts
const x: { readonly a: number } = { a: 42 }
const y: { a: number } = x
y.a = 10
console.log(x) // { a: 10 } 変更されてるし、no error
そうだね