TypeScriptにはPickだとかOmitだとか便利な型ユーティリティが組み込みでありますが、あれらじゃ足りないことがたまにあります。
例えば、eから始まるキーだけ抽出したいとか。
そういうときはmapped typesでキーを再マッピングしましょう。
/**
* プロパティの名前が`e`で始まるエントリだけ抽出します。
*/
type PickElegantEntry<R extends Record<PropertyKey, unknown>> = {
[k in keyof R as `${k extends `e${string}` ? r : never }`]: R[k]
}
面白いことに、再マッピングでneverを返すとそのキーについては除外されます。なので、出力はこうなります:
type RushE = PickElegantEntry<{
elegant: 1,
notElegant: "excluded!",
elephant: 2,
electricity: 3
}>;
const eeeeee: RushE = { elegant: 1, elephant: 2, electricity: 3 };