一个接口的Typescript键扩展了另一个接口

时间:2019-05-30 22:58:54

标签: typescript generics

我有一个基本界面:

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}}接口?

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";

这是您要找的吗?