2017-07-22 11 views
2

値/タプルからユニオン型を派生さは、私はリスト const list = ['a', 'b', 'c']活字体が配列の

はそれが'a' | 'b' | 'c'である。この値組合タイプから派生することはできませんがあるだろうか?

静的配列の値だけを許可する型を定義したいので、これが必要です。また、実行時にこの値を列挙する必要があるので、配列を使用します。

インデックス付きオブジェクトで実現することが可能であるかの例:

const indexed = {a: null, b: null, c: null}

const list = Object.keys(index)

type NeededUnionType = keyof typeof indexed

しかし、このインデックス付きマップなしで行うことが可能である場合、私は疑問に思います。

+0

本質的に、タイプをオンザフライで生成したいですか? – SwiftsNamesake

+0

コンパイル時にのみ型が存在するため、実行時に動的に型を作成することはできません。 – jonrsharpe

+0

これは興味深い質問です。あなたのユースケースは何ですか? – unional

答えて

3

一つの問題は、そう、文字通り['a','b','c']がタイプstring[]と推測されますです型システムは特定の値を忘れるでしょう。これは迷惑な繰り返しである

const list: ['a','b','c'] = ['a','b','c']; // tuple 

が、少なくとも、タプル型としてリストを解釈し、

const list = ['a' as 'a','b' as 'b','c' as 'c']; // infers as ('a'|'b'|'c')[] 

または、多分よりよい:あなたは、文字列リテラルとして各値を覚えておくタイプのシステムを強制することができます実行時に外的なオブジェクトを導入することはありません。

今、あなたはこのようなあなたの組合を取得することができます:

type NeededUnionType = typeof list[number]; // 'a'|'b'|'c'. 

に役立ちます願っています。


UPDATE

私はこの答えを掲載するので、私はあなたのライブラリーに機能を追加するために喜んでいる場合は、タプルタイプを推測する方法を見つけました。 tuple.tsの機能tuple()をチェックしてください。それを使用すると、あなたは次のように書くことができ、自分自身を繰り返すことはできません:

幸運!

+0

これは最初に気が付かなかった最も正確でエレガントな解決策です。) – WHITECOLOR

+0

私は、おそらく関連性のある情報で答えを更新しました。 – jcalz

+0

リストのサイズが限られているので、うれしいです) – WHITECOLOR

0

アレイではこれを行うことはできません。

なぜなら、変数をconstとして宣言しても、配列の内容は変わる可能性があるため、@jonrsharpeはこれが実行時であると言います。

あなたが欲しいものを考えると、keyofinterfaceを使用する方が良い場合があります。

interface X { 
    a: string, 
    b: string 
} 

type Y = keyof X // Y: 'a' | 'b' 

またはenum

enum X { a, b, c }