将接口定义为具有保证属性的任何接口?

时间:2016-05-02 17:20:59

标签: typescript

我正在点击一个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,我失去了所有建议。

有没有办法告诉打字稿“这个对象至少包含这些字段,还有其他任何我可能要求的字段”,以保证字段显示为智能感知建议?

1 个答案:

答案 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

playground