次のようにしてください。
enum FooKeys {
FOO = 'foo',
BAR = 'bar',
}
_
このようなインターフェースを作りたいのですが、手でキーを定義する代わりに、列挙体の値からそれを取り除きます。
interface Foo {
foo: string
bar: string
}
_
TypeScriptでこのようなものはありますか?
ありがとう!
はい?
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;
}
_
@ 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の実装はよく説明されています こちら