web-dev-qa-db-ja.com

TypeScriptのEnum値から型を構築する方法

次のようにしてください。

enum FooKeys {
  FOO = 'foo',
  BAR = 'bar',
}
 _

このようなインターフェースを作りたいのですが、手でキーを定義する代わりに、列挙体の値からそれを取り除きます。

interface Foo {
  foo: string
  bar: string
}
 _

TypeScriptでこのようなものはありますか?

ありがとう!

13
moltar

はい?

enum FooKeys {
  FOO = 'foo',
  BAR = 'bar',
}

interface Foo {
  foo: string
  bar: string
}

class Test implements Foo {
    public foo: string = FooKeys.FOO;
    public bar: string = FooKeys.BAR;
}
 _
0
joe

@ Hackapeの解決策 は素晴らしいですが、私は以下のように彼の解決策を拡大する最小の重複を見つけました。

type ReverseMap<T extends Record<keyof T, any>> = {
  [V in T[keyof T]]: {
    [K in keyof T]: T[K] extends V ? K : never;
  }[keyof T];
}

const Map = {
  'FOO': "foo" as "foo",
  'BAR': "bar" as "bar",
}

const reverseMap: ReverseMap<typeof Map> = Object.entries(Map).reduce((rMap, [k, v]) => {
  rMap[v] = k;
  return rMap;
}, {} as any);

export type Values = keyof typeof reverseMap; // 'foo' | 'bar';
 _

ReverSemapの実装はよく説明されています こちら

0
Akash Babu