可以说我有这样的代码:

interface KeysA {
  'propA1': number;
  'propA2': string;
}

class ClassA {
  public set<K extends keyof KeysA>(prop: K, value: KeysA[K]): void {}
}

interface KeysB {
  'propA1': HTMLDivElement;
  'propA2': HTMLButtonElement;
}

class ClassB {
  public set<K extends keyof KeysB>(prop: K, value: KeysB[K]): void {}
}

KeysAkeysB 就像set方法的守卫一样 . 所以 new ClassA().set('propA1', 'somestr') 抛出错误,因为 KeysApropA1 的类型是 number . 没关系 .

现在让我说我想写下面的类:

class UniversalWrapper<
    TTarget,
    TItem extends TTarget extends {
      set<TK extends keyof infer TItem>(prop: infer TK, value: infer TProp): void
    } ? TItem : never > {
  public prop?: TItem;
  public constructor({target}: {target: TTarget}) {
  }
}

const w = new UniversalWrapper({
  target: new ClassA()
});
w.prop = '111'; // No type guard here!!!

w.prop 的类型只是 {} . 为什么我不能推断 keyof 接口的基础?

让's assume I can'重写 ClassAClassBKeysAKeysB ,因为它们来自第三方库 .