如何将数据组表示为通用Typescript接口 简言之:
如何使用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
- 组的类型
(属于组的所有属性)G
- 组中项目的类型
(一个项目的所有属性,其中一个组有几个属性)I
中属性的类型G
,其值为组的N
项数组G[N]
I[]
到目前为止我都试过了 修订#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
,因此这似乎是不必要的