問題 & 解答
組み込みのOmit<T, K>
を実装する。T
のプロパティから、K
を除いた型を返す。
別解(こっちの方がナウい)
調べたこと
Key Remapping in Mapped Types
Mapped Typesで使えるプロパティ名(キー)の再定義方法。
一例としてすべてのプロパティをreadonly
にするような型を書いてみます。
(組み込み型としてReadonly
がありますが、理解のためにあえて再実装します)
このMapped Typesの使用法では、プロパティの属性は変わっていますが(指定なし→readonly
)、プロパティ名自体は変わっていません(name
はname
のまま、author
はauthor
のまま)。
TypeScript 4.1 以降で導入されたMapped Typesで使用できるas
キーワードを使用すると、プロパティ名を変更することができるようになります。
as
の後ろに変換後の名前を指定します。今回はTemplate Literal Typesを利用して、動的にプロパティを組み立てています。
:::message
Capitalize
については、TypeScriptのコンパイラに組み込まれている型でその名の通り1文字目を大文字にして返します。
定義としてはCapitalize<string>
になりますが、keyof
で取得しているのはオブジェクトのプロパティなのでstring | symbol | number
の可能性があるため、参照したプロパティ名をそのまま使用してしまうとエラーになります。
そのため、インターセクション型を利用して、string
に絞り込んでいます。
:::
ここまでの例では単純にプロパティ名を変換しているだけでしたが、as
はnever
を返した場合にそのプロパティを除外することもできます。これが今回の問題の別解です。
参考
https://www.typescriptlang.org/docs/handbook/2/mapped-types.html#key-remapping-via-as
https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html
感想
組み込みのExcludeを使っていいのかどうかわからなくて再実装しました。Excludeは過去回で登場しています。
https://ikuma-t.work/posts/type-challenge-exclude
解いた後にantfuさんの解答のスレッドをみてas
が使えることを知って色々と調べました。ワカラナイコトマダマダタクサンネ・・・。