interface ReadonlyFields {
readonly name: string
readonly age: number
}
のようなreadonlyがフィールドに指定されている定義から全てのreadonlyを除去する方法の紹介です。
type Assignable<T> = {
-readonly [P in keyof T]: T[P]
}
// つまり
// Assignable<ReadonlyFields> == {
// name: string
// age: number
// }
// になります
このような定義を行えば下のように使えます
const f: Assignable<ReadonlyFields> = {
name: "Tom",
age: 20
}
f.name = "Bob"
f.age = 30
余談
CDKでXXXPropsを構築する時にreadonlyを外したくてこの方法を見つけました。