🗂

段階的にMyPickを作る

2023/12/15に公開

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