【问题标题】:Typescript create key using a generic type打字稿使用泛型类型创建键
【发布时间】:2019-11-20 21:27:04
【问题描述】:

我正在尝试编写一个通用接口,它接受两种类型,Entry, T 返回的内容和包含此内容的key, K。

我不确定这是否可以使用打字稿完成。

有人知道吗?谢谢!

// this is a bad way of doing it
export interface Reconfigure<T> {
  title: string
  keyOne?: Entry<T>[]
  keyTwo?: Entry<T>[]
  keyThree?: Entry<T>[]
  keyFour?: Entry<T>[]
}

// this is close to what I'd want to do, but doesn't work
export interface Reconfigure<T, K> {
  title: string
  [K]: Entry<T>[]
}

【问题讨论】:

  • 你可以用类型别名做你想做的事,例如type Reconfigure&lt;T, K&gt; = { [key in K]: Entry&lt;T&gt; } 但不确定您是否可以让它像界面一样工作。
  • 顺便说一句,当您在问题中添加短语“不起作用”时,您应该始终显示不起作用的结果(即它导致的错误/警告)。
  • @spender 我不确定。 OP 希望最终,K 将是一个特定的属性(例如,对于 K = 'foo',接口将具有 prop foo: Entry&lt;T&gt;[]}..

标签: typescript


【解决方案1】:

您可以使用映射类型。预定义类型 Record 和 Partial 应该允许您基于字符串文字类型的联合创建类型。添加类型的固定部分只需使用交集类型(&amp;):

export type Reconfigure<T, K extends PropertyKey> = Partial<Record<K, Entry<T>>> &  {
    title : string
}

type T = Reconfigure<string, "k1" | "k2" | "k4">
// same as
// type T = {
//     k1?: Entry<string> | undefined;
//     k2?: Entry<string> | undefined;
//     k4?: Entry<string> | undefined;
//     title: string;
// }

Playground Link

【讨论】:

  • 这对我有用,而且很干净,谢谢提香!
猜你喜欢
  • 2021-11-26
  • 2021-02-07
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 2020-01-17
  • 2020-06-29
  • 1970-01-01
  • 2018-04-27
相关资源
最近更新 更多