2017-04-21 15 views
5

typescriptで型を宣言して、配列の内部型を '抽出'する方法はありますか?typescriptで配列から型を抽出するにはどうすればよいですか?

例:

のは、私はすでに私のコードベースではこのような何かを持っているとしましょう:私が欲しいもの

export interface Cache { 
    events: Event[], 
    users: User[] 
} 
type CacheType = Event[] | User[]; 

//or maybe: 
// type TypeOfProperty = T[keyof T]; 
// type CacheType = TypeOfProperty<Cache>; 

がこれに相当しますものです:

type InnerCacheType = Event | User; 

しかしなし何かを追加するたびに手動で再入力するCacheまたはCacheType

これはTypescriptで可能ですか?

答えて

2

TypeScript 2.1以上を使用できるとします。そうしないと、探しているものを達成する方法がありません。

また、Cacheインターフェイスのすべてのプロパティが配列になることは当然のことです。これが当てはまらない場合、あなたの質問は無意味になるので、私もこの前提を立てます。

一般的には、CacheTypeは、任意の継承されたプロパティを含む

type CacheType = Cache[typeof Cache]; 

のように書くことができます。得られる型はEvent[] | User[]と等価ですが、このような共用体型から配列要素を抽出することは不可能です。

解決策は、マップされた型を使用しています。 InnerCacheTypeあなたが探しているが、実際には

type InnerCacheType = MappedCacheType[typeof MappedCacheType]; 

どこ

type MappedCacheType = { [P in keyof Cache]: Cache[P][0]; }; 

のように書くことができ、最後のタイプは

{ events: Event; users: User; } 

と等価である活字体は、同じ名前を保持していることに注意してください元のものとして。

ユースケースを考慮しないで、配列タイプTのコンポーネントタイプを表現する方法は、T[0]です。

関連する問題