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

带有包含特定类型的对象属性的TypeScript类型,typescript,Typescript,我想创建一个泛型类型compatiblePro,它将解析为一个字符串类型,包含T的所有属性,这些属性包含U类型的值 我想要实现的示例: class C { a: number; b: string; c: Date; } type DatePropOfC = PropCompatible<C, Date>; // "c" type NumberOrStringPropOfC = PropCompatible<C, number | string>

我想创建一个泛型类型
compatiblePro
,它将解析为一个字符串类型,包含
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
C类{
a:数字;
b:弦;
c:日期;
}
键入DatePropOfC=PropCompatible;//“c”
类型NumberStringPropOfc=PropCompatible;//“a”|“b”
键入AnyPropOfC=PropCompatible;//与C的键相同

这是否可以通过TypeScript 2.8条件类型实现?我尝试了一些组合,但找不到正确的组合。

确定可以使用条件类型和额外的类型查询来实现这一点

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

这给出了正确的类型,但由于某些原因,它在泛型上下文中不起作用:(我将就此提出一个新问题。看起来我还不能提出一个新问题,所以我必须在这里提问。
函数getDate(t:t,k:PropCompatible):Date{return t[k];}
无法编译,因为TypeScript认为该类型是
t[k]
无法分配到日期。有没有办法解决这个问题?@MikhailBurshteyn您需要以不同的方式设置约束。我现在正在打电话,我会尝试添加一个适合您的版本,但我会在大约一个小时或更长的时间内完成so@MikhailBurshteyn添加了一个适用于YouTube的版本:在编辑队列中,我遇到了您在分流中投票的问题。选择错误。请:认真研究分流帮助,避免将不属于那里的项目放入编辑队列中。(我是专门谈论的)。请理解您的投票会产生后果!
function getDate<T extends Record<K, Date>, K extends string>(t: T, k: K): Date {
    return t[k];
}