はじめに
typescriptには組み込みで、Requiredという型があります。
type Dummy = {
hoge?: string
fuga?: string
bar?: string
}
Required<Dummy>
//{
// hoge: string
// fuga: string
// bar: string
//}
Requiredの第一ジェネリックスに型を入れると、全て必須プロパティにしてくれます。
いわゆるUtility Type ですね。
指定したプロパティだけ必須にしてほしい
組み込みのRequiredでは、全て必須プロパティになってしまいます。
組み込みで駄目ならパッケージを使う?
このためだけにパッケージを入れるのも煩わしい。
そういうときはサクッと自分で実装してしまいましょう。
実装
type Dummy = {
hoge?: string
fuga?: string
bar?: string
}
type Required<T,K extends keyof T> = T & {
[P in K]-?: T[P]
}
Required<Dummy,"hoge">
//{
// hoge: string
// fuga?: string
// bar?: string
//}
自分で実装したRequiredは第一ジェネリクスに型、第二ジェネリクスに必須にしたいプロパティ名を入れると、特定のプロパティだけ必須にすることができます。
解説
type Required<T,K extends keyof T>
extends keyof
はプロパティをジェネリクスとして扱える機能です。
今回の場合はT
型に含まれるプロパティをK
としています。
= T & {
[P in K]-?: T[P]
}
typescriptでin
は反復処理を表します。
Require<Dummy,"hoge"|"fuga">
のように複数のプロパティが渡された時は、それぞれhoge:string
・fuga:string
と処理されることになります。
-?
で?
を消去してくれます。
T
型と&
で結合しています。
必須プロパティと省略可能プロパティを結合すると、必須プロパティが優先されます。
指定したプロパティだけ省略可能プロパティにする方法は?
type PickPartial<T,K extends keyof T> = Omit<T,K>&{
[P in K]?: T[P]
}
Omitで一度プロパティを消去してから、省略可能プロパティを追加しています。
最後に
パッケージを使いたいという方はこちらがおすすめです。
https://github.com/piotrwitek/utility-types