[TypeScript]型のmodifierを操作する

https://www.typescriptlang.org/docs/handbook/2/mapped-types.html#mapping-modifiers

type Foo {
  readonly bar: string;
  baz?: number;
}

modifierとは上記でいう、readonly?

これらは+-を使うことで、型に付与したり、削除したりできる。

(尤も、+に関しては特に指定が場合に自動付与されているため、明示的に使うのはもっぱら-の方かと思う。)

例えば強制的にmodifierを消す型は以下のようになる。

type Foo = {
  readonly bar: string;
  baz?: number;
}

type RemoveReadonly<T> = {
  -readonly [P in keyof T]: T[P];
}
type WritableFoo = RemoveReadonly<Foo>;

type RemoveOptional<T> = {
  [P in keyof T]-?: T[P];
}
type RequiredFoo = RemoveOptional<Foo>

Playgroundでの実行結果