【问题标题】:Typescript keyof one interface extending other interface [duplicate]一个接口的打字稿键扩展了另一个接口[重复]
【发布时间】:2019-05-30 22:58:54
【问题描述】:

我有一个基本界面:

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

另一个扩展它的接口:

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

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

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

在这种情况下,最好的解决方案是什么?是否可以只获取keyofAnother接口?

【问题讨论】:

  • 您对Options 的定义目前是多余的,因为Another[TKey]['data'] 现在总是计算为string。在您的实际代码中是否存在不是这种情况的实例?
  • 你真的需要Basic吗?到目前为止,您的 sn-ps 表明您可以只用 Record&lt;string, string&gt; 替换整个数据结构。
  • 我不明白你的用例是什么,但如果你正在寻找一种方法来获取接口的已知键(即,没有string),you can do it .如果那是您想要的,我倾向于将其作为副本关闭。否则,请清楚说明您要完成的工作。

标签: typescript generics


【解决方案1】:

如 cmets 中所述,可以使用带有条件类型推断的技巧获得 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";

这就是你要找的吗?

【讨论】:

  • 这就是我要找的,谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2021-04-30
  • 2016-04-28
  • 2021-09-04
  • 1970-01-01
  • 2019-05-04
相关资源
最近更新 更多