如何将数据组表示为通用Typescript接口 简言之:

如何将数据组表示为通用Typescript接口 简言之:,typescript,generics,types,typescript-generics,keyof,Typescript,Generics,Types,Typescript Generics,Keyof,如何使用Typescript类型的系统声明一个作为类型参数的通用接口 组的类型G(属于组的所有属性) 组中项目的类型I(一个项目的所有属性,其中一个组有几个属性) G中属性的类型N,其值为组的G[N]项数组I[] 并使生成的接口类型为一个组G,其属性N被类型化为一个项目数组I,,同时在生成的类型中还包括G的所有其他属性。 到目前为止我都试过了 修订#2(成功) 在阅读了一些关于计算索引类型(正确的名称?)及其限制的内容后,我提出了以下方法: 类型GroupOfItems={ [n在Gro

如何使用Typescript类型的系统声明一个作为类型参数的通用接口

  • 组的类型
    G
    (属于组的所有属性)
  • 组中项目的类型
    I
    (一个项目的所有属性,其中一个组有几个属性)
  • G
    中属性的类型
    N
    ,其值为组的
    G[N]
    项数组
    I[]
并使生成的接口类型为一个组G,其属性N被类型化为一个项目数组I,,同时在生成的类型中还包括G的所有其他属性。



到目前为止我都试过了 修订#2(成功) 在阅读了一些关于计算索引类型(正确的名称?)及其限制的内容后,我提出了以下方法:

类型GroupOfItems={
[n在GroupOn中]:项目[];
}
类型A={A:any,子类:B[]};
类型B={B:number};
设obj:GroupOfItems

修订版#1 使用的第一个答案提醒我出现语法错误。它提供了一个包含3个类型参数的有效接口。但是,结果类型缺少除项目数组之外的任何组属性

我的下一次尝试似乎是无效的Typescript(请参阅):

类型GroupOfItems={
[OtherProp in keyof Omit]:组[OtherProp];
[n在GroupProp中]:项[];
}

我天真的第一次尝试:


接口组项{
[键:NameOfItemsProp]:ItemType[];
}
然而,正如您在中所看到的,Typescript编译器对此并不满意,我想不出解决的办法

此构造的具体用法 假设以下类型

interface Movie{//示例项
身份证号码:,
标题:字符串,
发布年份:编号,
//…更多电影属性
}
接口MovieList{//一个示例组
身份证号码:,
描述:字符串,
//…更多列表属性
movies:Movie[],//此属性保存项数组
}
如果已定义,我希望生成的接口
GroupOfItems
与具有如下结构的对象兼容

{
id:0,
描述:“有趣的电影集”
总运行时间:9815,
//…其他列表属性
电影:[
{
id:0,
标题:“炽热的马鞍”,
发布年份:1974年,
// ... 
}
]
}
但是,我还希望具体类型
GroupOfItems
(假设定义了
Playlist
Song
)与

{
播放ID:0,
播放名称:string,
播放列表说明:字符串,
//…更多播放列表道具
songs:Song[]//此属性保存项数组
}
提问动机
我试图实现一个通用的数据源类,它可以对数据进行分组,并切换项目组的可见性。虽然输入数据的结构是恒定的,但在现有接口中,包含组项的属性的名称可能不同。

这就是您要查找的吗

interface Movie {  // An example Item
    id: number,
    title: string,
    releaseYear: number,
    // ... more movie properties
}

interface MovieList {  // An example group
    id: number,
    description: string,
    // ... more list properties
    movies: Movie[], // This property holds the item array
}

type GroupOfItems<Group, Item, GroupOn extends keyof Group> = {
    [key in GroupOn]: Item[];
}

const obj: GroupOfItems<MovieList, Movie, 'movies'> = {
    id: 0,
    description: 'A collection of funny movies',
    movies: [
        {
            id: 0,
            title: 'Blazing Saddles',
            releaseYear: 1974,
        }
    ]
};
interface Movie{//示例项
身份证号码:,
标题:字符串,
发布年份:编号,
//…更多电影属性
}
接口MovieList{//一个示例组
身份证号码:,
描述:字符串,
//…更多列表属性
movies:Movie[],//此属性保存项数组
}
类型GroupOfItems={
[输入GroupOn]:项目[];
}
常量对象:GroupOfItems={
id:0,
描述:“有趣电影集”,
电影:[
{
id:0,
标题:“炽热的马鞍”,
发布年份:1974年,
}
]
};

基本上是的。我看到这修复了我对索引类型(
[key in GroupOn]
)的语法,在漫长的一天之后,我没有理解它。但是,这还有一个问题,即
GroupOfItems
接口之外的最具移动性的属性(例如
id:number
)在结果类型上被标记为不存在。我已将你的答案复制到一个操场上,并试图修复它,但任何进一步的想法都是值得赞赏的。在我看来,剩余的问题是我自己解决的(参见编辑后的答案),但你帮助我突破了最初阻止我的问题。非常感谢。我已经向ofc投了更高的票,但我不确定是接受你的答案还是发布我的“最终”解决方案作为答案…@MaxAxeHax经过一些查看,我感到困惑的是,obj可以简单地用
const obj:MovieList
表示。这种泛型类型的确切意义是什么?请参见问题开头的部分“但是,我还需要具体类型
GroupOfItems
”。基本上,我想要一个泛型类型,其中包含项的属性的名称是一个类型参数。我想用它来构建一个通用数据源类,该类可以处理“分组”数据,而不管组中包含“项”的属性的名称。@MaxAxeHax即使在您提供的示例中,您仍然创建了一个“Playlist”对象,您可以声明它
const obj:Playlist
,因此这似乎是不必要的