Я пытаюсь создать тип, который будет рекурсивно исключать ключи из одного типа, если они не появляются в другом. Например, даны два типа:
type TargetType = {a: true, b: {c: true, d: true}};
type InputType = {a: string, b: { c: boolean, d: number, e: string }, f: number};
Я хочу создать универсальный тип PickMatchedKeys<T, U>
такой, что
PickMatchedKeys<InputType, TargetType> = {a: string, b: { c: boolean, d: number }}
У кого-нибудь есть идеи, как этого добиться? Вот моя лучшая попытка:
type PickMatchedKeys<T, U> = {
[K in keyof T]: K extends keyof U ? PickMatchedKeys<T[K], U[K]> : never;
}
Это работает нормально, но проблема в том, что ключи f
и b.e
все еще существуют в PickMatchedKeys<InputType, TargetType>
, но имеют тип never
. В идеале эти ключи вообще не должны присутствовать в конечном типе.