我有一个基本界面:
interface Basic {
[key: string]: {
data: string;
};
}
另一个扩展它的接口:
interface Another extends Basic {
'onekey': OneKeyData;
'secondkey': SeconKeyData;
}
我的问题是当使用通用T extends keyof Another
时,由于Basic接口,它允许任何字符串键。和Basic一样,它们都包含OneKeyData和SecondKeyData data
属性。如果extends Basic
没有在其他地方使用,我会删除它:
interface Options<TKey extends keyof Another> {
field: Another[TKey]['data'];
}
在这种情况下最好的解决方案是什么?是否可以仅获得keyof
的{{1}}接口?
答案 0 :(得分:2)
如评论中所述,可以使用带有条件类型推断的技巧使keyof
忽略索引签名。
type KnownKeys<T> = {
[K in keyof T]: string extends K ? never : number extends K ? never : K
} extends { [_ in keyof T]: infer U } ? U : never;
type KnownKeysOfAnother = KnownKeys<Another> // "oneKey" | "secondKey";
这是您要找的吗?