Исключить ключи объекта по их типу значения в TypeScript - PullRequest
2 голосов
/ 03 июня 2019

Я хочу сопоставить тип объекта подтипу, который включает только ключи, значения которых имеют определенный тип.

Например, что-то вроде 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, компилятор жалуется на его отсутствие.

1 Ответ

1 голос
/ 03 июня 2019

Связано aticle в комментарии, но в двух словах:

type SubType<Base, Condition> = Pick<Base, {
    [Key in keyof Base]: Base[Key] extends Condition ? Key : never
}[keyof Base]>;

type ExtractNumeric<T> = SubType<T, number>

...