我正在点击一个API,它返回以下结构中的图像列表:
{
"photos": {
"1": "PHOTOS/1.jpg",
"3": "PHOTOS/3.jpg",
"4": "PHOTOS/4.jpg",
"primary": "PHOTOS/X/PRI.jpg"
},
"sketches": {
"1": "SKETCHES/X/1.jpg",
"3": "SKETCHES/X/3.jpg",
"4": "SKETCHES/X/4.jpg"
}
}
基本合同是photos.primary
始终存在,photos
上的所有其他属性都是数字ID,而photos
中的每个ID都是sketches
中的匹配ID。这些ID不保证是连续的。
我想设置一个名为ImageIndex
的接口,它知道photos.primary
是一个字段,但也可以接受任何其他字段。我知道我可以将照片和草图标记为any
,但为了智能感知,我认为定义primary
的存在是值得的。
我尝试使用交叉类型,如下所示:
export interface PropertyImageIndex {
photos: ContainsPrimary&any;
sketches: any;
}
interface ContainsPrimary {
primary: string;
}
但是当VSCode通常显示它的智能感知建议时,什么也没有。这似乎表明any
优先于明确ImageList
类型的photos
,我失去了所有建议。
有没有办法告诉打字稿“这个对象至少包含这些字段,还有其他任何我可能要求的字段”,以保证字段显示为智能感知建议?
答案 0 :(得分:2)
如果我理解正确的话:
interface Photos {
primary: string;
[name: string]: string;
}
interface PropertyImageIndex {
photos: Photos;
sketches?: { [name: string]: string };
}
let a: Photos = {}; // error
let b: Photos = { primary: "" };
let c: Photos = { primary: "", a: 3 }; // error
let d: Photos = { primary: "", a: "" };
let e: PropertyImageIndex = { photos: { primary: "" } };
let f: PropertyImageIndex = { photos: { primary: "" }, sketches: {} };
let g: PropertyImageIndex = { photos: { primary: "" }, sketches: { key: "" } };
let h: PropertyImageIndex = { photos: { primary: "" }, sketches: { key: 4 } }; // error