Исходя из вашего описания, этот тип должен выполнить свою задачу:
export type Result<INPUT, SPEC> = INPUT extends object ? SPEC extends object ? {
[K in keyof INPUT]: SPEC extends Record<K, infer SPECK> ?
Result<INPUT[K], SPECK> :
true
} : never : never;
// r is { foo: true; bar: never; goo: { a: never; b: true; }; }
type r = Result<{
foo: number,
bar: string,
goo: { a: number; b: string }
}, { bar: number, goo: { a: number }}>
Часть, которую вы, вероятно, пропустили, - SPEC extends Record<K, infer SPECK>
, это проверяет, расширяет ли тип запись с помощью ключа K
ипомещает тип этого ключа в SPECK
.
Вы не указали явно, что происходит в ветвях else (если какой-либо из параметров типа не является объектом, поэтому я помещаю туда never
, но вы можете настроить его так, как вам нужно)
Пустья знаю, что если я не понял все правильно, мы можем внести необходимые изменения.