尝试使用仅具有某种类型的字段创建子类型,然后创建一个作为该子类型的键的类型

时间:2019-01-20 20:47:41

标签: typescript typescript-generics

我正在尝试创建通用类型为ST的子类型(I),以强制该子类型(ST)是一个对象,其中包含来自该I具有特定类型DocumentReference的泛型。

示例:

type SubType<Base, Condition> = Pick<
  Base,
  { [Key in keyof Base]: Base[Key] extends Condition ? Key : never }[keyof Base]
>;

  private joinOnField<
    I,
    J,
    K extends keyof ST,
    ST = SubType<I, DocumentReference>
  >(data: ST, docRefField: K): Observable<J> {
    if (!data[docRefField]) {
      return of(null);
    }

    if ((<DocumentReference>data[docRefField]).get) {
      return of(null);
    }

    return from(data[docRefField].get().then(snap => snap.data() as J));
  }

我一直说错了

  

将“ ST [K]”类型转换为“ DocumentReference”类型可能是   错误,因为任何一种类型都不能与另一种类型充分重叠。如果   这是有意的,请先将表达式转换为“未知”。

我以为我很明确地表示ST仅具有DocumentReference类型的字段

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

只要条件类型仍然具有未解析的类型参数(例如,在泛型函数内部),编译器就无法遵循这些条件。

您应遵循编译器的建议,并使用双重声明data[docRefField] as unknown as DocumentReference