2017-08-07 4 views
1

のイントロスペクションは、私は、この型の変数の一致を確認することができますどのように カスタムtypescriptですタイプ

type MyType = 'left' | 'right'; 

typescriptです

でカスタム型を定義しますか? このタイプの可能な値をどのように反復処理できますか? (対応する選択要素を作成するなど)

+0

実行時に型で何もできません。つまり、実行時に型をチェックしたり、繰り返したりすることはできません。 –

答えて

1

これはできません。

type MyType = 'left' | 'right'; 
const MyTypeMeta = ["left", "right"]; 

リンクされた問題の多くで、このテーマに関するan old discussion hereあり:

あなたが書くと、このようなものを使用する必要があります。おそらくthis messageの希望ですが、今は何も完了していません。

+0

実際には私たちが避けようとしている解決策です。 –

+0

@YoannAugen私は同じ問題があることを理解しています。私はこのソリューションを使用しました。なぜなら、何も良いことが見つからなかったからです(昨年1月)しかし、最後に私が投稿したリンクを見てください。それは本当に私たちが必要とするものです。完全ではないかもしれませんが、非常に有望です。 – Paleo

1

あなたは「単純型」であることを行うことはできませんが、Typescript 2.4以来、あなたは文字列値を列挙型を使用することができます。

enum MyType { 
    LEFT='left', 
    RIGHT='right' 
} 

for (let i in MyType) { 
    console.log(MyType[i]); //will print "left" and "right" 
} 

がMyTypeという名前のオブジェクトを実行時に存在し、その値が{RIGHT:'right',LEFT:'left'}あるので、それは動作します。

1

実行時にタイプ情報を追加するのは、TypeScriptのnon-goalです。つまり、タイプを定義して実行時に検査することを許可したくないということです。

しかし、その逆はうまくいきます:実行時に存在するオブジェクトを作成し、TypeScriptを使用して型情報を推測します。あなたのケースでそれを行うための1つの方法があります。

まず、以下のヘルパー関数を追加します。

function stringLiteralArray<T extends string>(...args: T[]): T[] { 
    return args; 
} 

これは活字体だけではなくstring[]の文字列リテラルの配列を推測することができます。

今、あなたはmyTypeと呼ばれるランタイムオブジェクトを作成し、それからMyTypeを導き出すことができます。

const myType = stringLiteralArray('left', 'right'); // ('left'|'right')[] 
type MyType = (typeof myType)[number]; // 'left' | 'right' 

その後、実行時とコンパイル時の型情報の両方を持っています。

function isMyType(x: any): x is MyType { 
    return myType.includes(x); // needs es2016 at least, or implement yourself 
} 

あなたは、実行時にmyTypeを繰り返すことができ、あなたはコンパイル時にMyTypeexhaustiveness checkingを行うことができます:

function foo(x: MyType): string { // error, not exhaustive 
    switch (x) { 
    case 'left': return 'L'; 
    case 'rihgt': return 'R'; // error, 'rihgt' isn't 'left'|'right' 
    } 
} 
変数は、次のユーザー定義型のガードとその型であるかどうかを確認することができます

希望に役立ちます。

関連する問題