在TypeScript中按值类型排除对象键

时间:2019-06-03 16:20:59

标签: javascript typescript typing mapped-types conditional-types

我想将对象类型映射为仅包含其值具有特定类型的键的子类型。

例如,类似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 个答案:

答案 0 :(得分:1)

在评论中链接了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>