Как построить тип из значений перечисления в TypeScript? - PullRequest
0 голосов
/ 13 марта 2019

Учитывая следующее:

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

Я бы хотел создать такой интерфейс, но вместо того, чтобы определять ключи вручную, создайте его из значений enum.

interface Foo {
  foo: string
  bar: string
}

Возможно ли что-то подобное с TypeScript?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Да, вы можете использовать значения перечисления в качестве ключей. И вы можете использовать сопоставленный тип , такой как стандартная библиотека Record<K, V> для предотвращения повторения:

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

// probably all you need, but it's a type alias
type FooType = Record<FooKeys, string>;

// if you need an interface instead you can do this
interface FooInterface extends FooType {};

И вы можете убедиться, что это работает:

declare const foo: FooInterface;
foo.foo; // okay
foo[FooKeys.FOO]; // okay

foo.bar; // okay
foo[FooKeys.BAR]; // okay

foo.baz; // error

Это работает для вас? Удачи!

0 голосов
/ 13 марта 2019

да

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;
}
...