🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

10684閲覧

TypeScript で string から enum に変換したいときの便利な書き方、または namespace を使わない方法について

tanishi_a

総合スコア484

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

1クリップ

投稿2019/10/20 12:31

TypeScript で string から enum に変換したいときに、
毎回、as any とか as enum名 とか書くのが面倒で、
enum 毎に、下記のような関数を用意して使っています。

TypeScript

1enum Color { 2 Red, 3 Green, 4 Blue, 5} 6export default Color; 7 8namespace Color { 9 export function fromString(str: string): Color { 10 return (Color as any)[str] as Color; 11 } 12} 13 14const b: Color = Color.fromString('Blue'); 15console.log(b);

ただ、この書き方だと、

  • enum 毎に毎回関数を作らないといけないのが面倒
  • tslint で以下のように怒られるので非推奨な書き方なのだろうと思われる
'namespace' and 'module' are disallowed (no-namespace)

という問題があり、
こういう場合に便利な書き方は無いでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは

一案としまして、以下

に記載されている下記のサンプルと同じような方法で、ご質問に挙げられている type Color を作成するのはいかがでしょうか?

typescript

1/** Utility function to create a K:V from a list of strings */ 2function strEnum<T extends string>(o: Array<T>): {[K in T]: K} { 3 return o.reduce((res, key) => { 4 res[key] = key; 5 return res; 6 }, Object.create(null)); 7} 8 9/** 10 * Sample create a string enum 11 */ 12 13/** Create a K:V */ 14const Direction = strEnum([ 15 'North', 16 'South', 17 'East', 18 'West' 19]) 20/** Create a Type */ 21type Direction = keyof typeof Direction; 22 23/** 24 * Sample using a string enum 25 */ 26let sample: Direction; 27 28sample = Direction.North; // Okay 29sample = 'North'; // Okay 30sample = 'AnythingElse'; // ERROR!

参考になれば幸いです。

投稿2019/10/20 13:25

編集2019/10/20 13:38
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanishi_a

2019/10/20 13:48

おお! これは求めているものっぽいです。 試しに書いてみると、バッチリ補完も効きますね。フシギ。
jun68ykt

2019/10/20 13:59

コメントありがとうございます。 > バッチリ補完も効きますね。フシギ。 はい。効いてくれます。その > フシギ。 を解消して納得するには、strEnum でやっていることや、 keyof と typeof とを連続して、keyof typeof Direction と書くところをきっちり読み解く必要がありそうです。(私はまだその辺りの詳細は読み切れていませんが・・・) ちなみに、tanishi_aさんと同様な経緯で、TypeScript Deep Dive の上記のサンプルをみつけた方のブログ記事もありました。 TypeScriptのString Enumsを少し便利にするTips (mitsuruogさん) https://blog.mitsuruog.info/2019/04/typescript-string-emun-tips
tanishi_a

2019/10/20 14:25

補足もありがとうございます。 これ使うと文字列にするために `Color[Color.Red]` みたいにする必要もなくなりますね。 使わない手が無いような気がしてきました。
jun68ykt

2019/10/20 14:55

そうですね。サンプルのコードで、 sample = 'AnythingElse'; と代入しようとするとエラーになってくれる所も、なかなか優れモノですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問