代码之家  ›  专栏  ›  技术社区  ›  Mikhail Burshteyn

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

  •  3
  • Mikhail Burshteyn  · 技术社区  · 8 年前

    我想做一个泛型 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 回复  |  直到 8 年前
        1
  •  3
  •   Titian Cernicova-Dragomir    8 年前

    当然你可以用条件类型和一个额外的类型查询来实现这一点

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

    编辑

    虽然上面的类型对于获得某个类型的键的并集很有效,但在泛型函数的上下文中,它的缺点是编译器无法跟踪属性访问将属于给定属性类型这一事实。要获得这种行为,我们需要声明约束,即我们只以不同的方式获取给定字段类型的键。我们可以使用额外的类型参数 K 关键和任务 千 字段的类型 T 是给定类型的( Date 例如)

    function getDate<T extends Record<K, Date>, K extends string>(t: T, k: K): Date {
        return t[k];
    }
    
    推荐文章