具有包含特定类型的对象属性的TypeScript类型

时间:2018-08-26 17:18:17

标签: typescript

我想制作一个通用类型CompatibleProp<T, U>,它将解析为一个包含T所有具有U类型值的属性的字符串类型。

我要实现的示例:

class C {
    a: number;
    b: string;
    c: Date;
}

type DatePropOfC = PropCompatible<C, Date>;  // "c"
type NumberOrStringPropOfC = PropCompatible<C, number | string>;  // "a" | "b"
type AnyPropOfC = PropCompatible<C, any>;  // same as keyof C

使用TypeScript 2.8条件类型可以实现吗?我尝试了几种找不到合适的组合。

1 个答案:

答案 0 :(得分:3)

确定可以使用条件类型和额外的类型查询

type PropCompatible<T, TProp> = { [P in keyof T] : T[P] extends TProp ? P : never}[keyof T]

修改

虽然上述类型对于获取某种类型的键的并集非常有效,但是在泛型函数的上下文中,它的缺点是编译器无法遵循属性访问将是给定属性的事实类型。为了获得这种行为,我们需要声明约束,即我们只能以不同的方式获取给定字段类型的键。我们可以使用一个额外的类型参数K来实现此目的,并规定K中字段的类型必须是给定类型(例如T

Date