我想制作一个通用类型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条件类型可以实现吗?我尝试了几种找不到合适的组合。
答案 0 :(得分:3)
确定可以使用条件类型和额外的类型查询
type PropCompatible<T, TProp> = { [P in keyof T] : T[P] extends TProp ? P : never}[keyof T]
修改
虽然上述类型对于获取某种类型的键的并集非常有效,但是在泛型函数的上下文中,它的缺点是编译器无法遵循属性访问将是给定属性的事实类型。为了获得这种行为,我们需要声明约束,即我们只能以不同的方式获取给定字段类型的键。我们可以使用一个额外的类型参数K
来实现此目的,并规定K
中字段的类型必须是给定类型(例如T
)
Date