2017-06-20 5 views
0

特定のインターフェイスを拡張している限り、オブジェクトを受け入れる配列を持つインターフェイスをモデル化したいと思います。私はまだジェネリックスを学んでいるので、私に同行してください。ジェネリックアレイのインターフェイスのモデリング

ここに私の "ベース" のインターフェースです:

export interface IEntry { 
    sys: { 
    contentType: { 
     . . . 
    } 
    } 
} 

と私の拡張インターフェース:

export interface IEntries { 
    items: IEntry[]; <- doesn't allow for IWorkSample or future interfaces 
    limit: number; 
    skip: number; 
    sys: { 
    type: string; 
    }; 
    total: number; 
} 

私はもちろん行うことができます。

export interface IWorkSample extends IEntry { 
    fields: { 
    . . . 
    } 
} 

ここアレイを有するインタフェースです:

items: IWorkCategory[] | IWorkSample[]; 

ですが、タイプを追加しておく必要があります。

IEntryのオブジェクトが含まれるように、IEntriesインターフェイスを記述したいと考えています。私はGenerics Documentationを読んでいるが、明らかに不足している。

私はitems: any[]を使用することができますが、将来的に予想されるオブジェクトのオブジェクトには保証はありません。誰かが意味を成す例で私を助けてくれますか?

答えて

1

あなたは以下のようにIEntryを拡張型パラメータを導入することができます

interface IEntries<T extends IEntry> { 
    items: T[]; 
    // ... 
} 

など、それを使用する:

let entries: IEntries<IWorkSample> = { 
    items: ... // IWorkSample[] here 
} 
+0

'IEntries'はしかし' IEntry'を延長しない... '項目'は' IEntry'を拡張する型の配列です...それとも、私は完全にポイントを逃していますか? – Brandon

+0

正しい。これは上の例が示しているように、 'IEntry'は' IEntry'を拡張するだけで、IEntryは型パラメータ 'T'を拡張しません。 – Saravana

+0

私は理解していると思います。私のコードをリファクタリングしてみましょう。 – Brandon

関連する問題