0

我有一个基本界面:

interface Basic {
  [key: string]: {
    data: string;
  };
}

扩展它的另一个接口:

interface Another extends Basic {
  'onekey': OneKeyData;
  'secondkey': SeconKeyData;
}

我的问题是当使用泛型T extends keyof Another时,由于基本接口,它允许任何字符串键。OneKeyData 和 SecondKeyData 它们都包含dataBasic 中的属性。extends Basic如果它没有在其他地方使用,我会删除:

interface Options<TKey extends keyof Another> {
  field: Another[TKey]['data'];
}

在这种情况下,最好的解决方案是什么?是否有可能keyof只获得Another接口?

4

1 回答 1

3

正如评论中提到的,可以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";

那是你要找的吗?

于 2019-05-31T00:43:51.207 回答