让我们说我有这样的代码:
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 {}
}
KeysA
和keysB
的作用类似于set方法的防护。因此new ClassA().set('propA1', 'somestr')
引发错误,因为propA1
中KeysA
的类型为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
接口的基础?
假设我无法重写ClassA
,ClassB
,KeysA
和KeysB
,因为它们来自第三方库。