14
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ZOZOテクノロジーズその2Advent Calendar 2018

Day 2

TypeScriptの文字列enumでrawValue→enumを実現する

Last updated at Posted at 2018-12-01

TypeScriptの仕様上、文字列enumはreverse mapping(rawValue→enum)ができません
(文字列の場合、生の値が重複する可能性があるから・・・?)。
実際に公式のドキュメントにも記述があります。(https://www.typescriptlang.org/docs/handbook/enums.html)

Keep in mind that string enum members do not get a reverse mapping generated at all.

仕組みがないなら作ってしまおうということで、ヘルパーメソッド的なものを自作してみました。v3.1.6で動作確認しています。


export function mapToEnum<T>(enumObject: T, value: any): T[keyof T] | undefined {
  if (typeof enumObject === 'object') {
    for (const key in enumObject) {
      if (enumObject.hasOwnProperty(key) && enumObject[key] === value) {
        return enumObject[key]
      }
    }
  } else if (enumObject instanceof Array) {
    return enumObject.find(value)
  }
  /* 3.0.x
  } else if ((enumObject as any) instanceof Array) {
    return (enumObject as any[]).find(value)
  }
  */
}

////////////////////

enum Meta {
  Hoge = 'hoge',
  Fuga = 'fuga',
  Foo = 'foo',
  Bar = 'bar'
}

const meta: Meta = mapToEnum(Meta, 'hoge')
console.log(meta) // hoge

本当はenumに存在する文字列だけ受け取れるようにしたいところですが、それができなかったので戻り値でundefinedを許容するようにしました。

14
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?