Typescript使用泛型类型创建键

Typescript使用泛型类型创建键,typescript,Typescript,我正在尝试编写一个通用接口,它接受两种类型,一种是由Entry,T返回的,另一种是由键K返回的 我不确定这是否是可以使用typescript完成的 有人知道吗?谢谢 // this is a bad way of doing it export interface Reconfigure<T> { title: string keyOne?: Entry<T>[] keyTwo?: Entry<T>[] keyThree?: Entry<

我正在尝试编写一个通用接口,它接受两种类型,一种是由
Entry,T
返回的,另一种是由
键K
返回的

我不确定这是否是可以使用typescript完成的

有人知道吗?谢谢

// 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>[]
}
//这是一种不好的做法
导出接口重新配置{
标题:字符串
keyOne?:条目[]
按键二:输入[]
按键三:输入[]
keyFour?:条目[]
}
//这接近我想要做的,但不起作用
导出接口重新配置{
标题:字符串
[K] :条目[]
}

您可以使用映射类型。预定义的类型
Record
Partial
应该允许您基于字符串文本类型的并集创建类型。添加类型的固定部分只是使用交叉点类型(
&
)的问题:

导出类型重新配置=部分&{
标题:字符串
}
类型T=重新配置
//同
//类型T={
//k1?:条目|未定义;
//k2?:条目|未定义;
//k4?:条目|未定义;
//标题:字符串;
// }

你可以用类型别名做你想做的事,例如
类型重新配置={[key in K]:Entry}
但不确定你是否能让它像接口一样工作。另外,当你在问题中添加短语“不工作”时,你应该始终显示不工作的结果(即它导致的错误/警告).可能是@spender的复制品我不确定。OP希望最终,K将是一个特定的属性(例如,对于K='foo',接口将有prop
foo:Entry[]}
。这对我来说很有用,而且非常干净,谢谢Titian!
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;
// }