🗂
段階的にMyPickを作る
typescriptでPickの型と同様のMyPickを作ってみます。
interface Sample {
a: string
b: number
}
という型があるとすると
type SampleKeys = keyof Sample
で"a"|"b"というユニオン型がとれます。
次に
type Sample2 = {[K in keyof Sample]: string}
とすれば
type Sample2 = {
a: string
b: string
}
が得られます。bの型まであわせるためには
type Sample2 = {[K in keyof Sample]: Sample[K]}
とやれば良いです。
あとは、これをGenericsにかえます。
type Sample3<X> = {[K in keyof X]: X[K]}
これで
type Sample3 = {
a: string
b: number
}
がでてきます。
さて、今の場合、特定のプロパティのみを取得したいとすると
type Sample4<X, KS> = {[K in KS]: X[K]}
としたいのですが、これだとKSがユニオン型なのか、KはXのキーなのかわかりません、
そこでそのような情報を型のパラメータの情報につけます。
type MyPick<X, KS extends keyof X> = {[K in KS]: X[K]}
できました。
このように段階的に型を考えて構成することができます。
Discussion