打字稿:推断基数

时间:2018-12-09 17:35:12

标签: typescript generics

让我们说我有这样的代码:

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')引发错误,因为propA1KeysA的类型为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接口的基础?

假设我无法重写ClassAClassBKeysAKeysB,因为它们来自第三方库。

0 个答案:

没有答案