可以说我有这样的代码:
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')
抛出错误,因为 KeysA
中 propA1
的类型是 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'重写 ClassA
, ClassB
, KeysA
和 KeysB
,因为它们来自第三方库 .