2016-05-02 9 views
1

私は次のような構造で画像のリストを返すAPIを打っています:基本的な契約はphotos.primaryが常に存在することであるインタフェースを保証されたプロパティで定義しますか?

{ 
    "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上の他のすべてのプロパティは、数値のIDであり、photos内のすべてのIDのために一致するIDはsketchesです。 IDは連続しているとは限りません。

がフィールドであることを知っているだけでなく、他のフィールドも使用できることを知っているImageIndexという名前のインターフェイスを設定したいと考えています。私はちょうどanyと写真やスケッチをマークすることができます知っているが、インテリセンスのために私はprimaryの存在を定義する価値があると思う。

私はそうのような交差点のタイプを使用してみました:

export interface PropertyImageIndex { 
    photos: ContainsPrimary&any; 
    sketches: any; 
} 

interface ContainsPrimary { 
    primary: string; 
} 

しかしVSCodeは、通常、それはインテリセンスの提案のショーだろうというとき、何もありません。これは、明示的なImageListタイプphotosの上にanyが続き、すべての提案を失うことを示しているようです。

typescriptに「このオブジェクトには少なくともこれらのフィールドがありますが、保証されたフィールドがインテリセンスの提案として表示されるように、他のフィールドがあります」と伝える方法はありますか?

答えて

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

+0

これは私が後だものです!ちょうどその「スケッチ」はオプションではありませんが、それは簡単な修正です。 –