Я хочу сопоставить тип объекта с подтипом, который включает только ключи, значения которых относятся к определенному типу.
Например, что-то вроде ExtractNumeric<T>, где
ExtractNumeric<{ str: string, num: number }> должен быть эквивалентен типу: { num: number }
Я пробовал это, но это не работает:
type ExtractNumeric<T> = { [k in keyof T]: T[k] extends number ? T[k] : never }
Этот фрагмент выдает ошибку типа:
let obj: ExtractNumeric<{ str: string, num: number }> = { num: 1 }
Потому что хотя ключ str ожидает значение never, компилятор жалуется на его отсутствие.
type ExtractNumeric<T> = Pick<T, { [k in keyof T]-?: T[k] extends number ? k : never }[keyof T]> let obj: ExtractNumeric<{ str: string, num: number }> = { num: 1 } Хотя наверняка дубликат..



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Связал статья в комментарии, но в двух словах:
type SubType<Base, Condition> = Pick<Base, {
[Key in keyof Base]: Base[Key] extends Condition ? Key : never
}[keyof Base]>;
type ExtractNumeric<T> = SubType<T, number>
В основном это работает, но учтите следующее: let obj: SubType<{ str: string, num: number }, boolean> = { num: 1, str: "" } Это не приводит к ошибке, но я думаю, что это больше связано с причудами TypeScript в отношении пустых типов объектов.
Начиная с TypeScript 4.1, есть более простой способ сделать это путем переназначения ключей: stackoverflow.com/a/63990350