2017-09-01 14 views
0

は、オン:両方のケースが同じように動作するようには思えTypeScriptに文字列ベースの列挙型が追加されたため、文字列リテラルを使用する理由はありますか?私はこのコードを持っている場合、私はコンパイラオプションnoImplicitReturnを持っていると仮定すると

enum ListA { 
    option1 = "opt1", 
    option2 = "opt2", 
    option3 = "opt3" 
} 

type ListB = "opt1" | "opt2" | "opt3"; 

function transformA(x: ListA): number { 
    switch (x) { 
     case ListA.option1: 
      return 1; 
     case ListA.option2: 
      return 2; 
    } 
} 

function transformB(x: ListB): number { 
    switch (x) { 
     case "opt1": 
      return 1; 
     case "opt2": 
      return 2; 
    } 
} 

、それらは両方とも判別組合と考えていると徹底的にチェックされます。

コンパイラはtransformAとtransformBの両方の関数でエラーを発生させます。両方の可能なケースを処理しないためです。

Code in playground.

だから今、文字列リテラルを使用する理由はありますか?それとも味の問題ですか?

この場合、可能な値が変更された場合にリファクタリングを容易にするため、この列挙型を使用する傾向があります。あなただけの文字列値を持っていない場合

答えて

0

一つの理由は、例えば、次のようになります。

function test (p: "yes" | "no" | true | false | 1 | 0) { 
} 
+0

これはもはや文字列リテラルではなく、異なるタイプの共用体です。 – vintem

+0

私は、文字列の列挙型を使用できない方法で文字列型を使用できることを指摘していました。文字列列挙型では、文字列型に限られており、他のリテラル値型と混合して興味深い結果を得ることができます。 –

0

は、これが問題に問題はなく、より良いSoftware Recommendationsで答えられることができました。

この例では、文字列リテラルを列挙型に置き換えるポストで説明したユースケースは、リファクタリングが必要な場合は簡単です。しかし、たとえば、キーワードの使用を考慮して、タイプまたはオブジェクトの既知のすべてのキー(typeofと組み合わせて)を有効な引数として渡すことを考慮する場合、文字列リテラルを使用することは、依然として有効です。コンパイル時に新しいオブジェクトを作成しないので、私自身はmapped typesをよく使っています。主な関心事は型ガード引数の使用です。

+0

あなたはおそらくソフトウェアの推奨についてこれを尋ねるでしょうが、keyofの使用は文字列リテラルタイプを手作業で作成するのと同じではありません。この場合、タイプを動的に作成しています。 – vintem

+0

@vintem私が明示的に答えたのは、 '現在、文字列リテラルを使用する理由はありますか?それとも私の答えは「はい」です**。あなたの質問があなたの記事に書かれているように使い方を指していたなら、私は列挙型の使い方などがより洗練されていることに同意するでしょう。 –

関連する問題