Утилитарный тип "унаследовать ключи перечисления" в TypeScript

Из ответа на вопрос "Создание призводного перечисления с ключами исходного в TypeScript" я узнал, что то, о чём я спрашиваю в вопросе, возможно:

enum SampleEnum {
  alpha = "FOO",
  bravo = "BAR"
}

type DerivedEnum = {
  [key in keyof typeof SampleEnum]: string
}

const derivedEnum: DerivedEnum = {
  alpha: '123',
  bravo: '321',
};

Ссылка на исходное решение

Теперь было бы неплохо создать утилитарный тип, который берёт все эти in keyof typeof на себя, а пользователю лишь остаётся указать исходное перечисление и тип значения для нового объекта.

Приведённое ниже попытка решения нерабочая:

export type InheritEnumerationKeys<Enumeration extends { [key: string]: string | number; }, ValueType> = {
  [key in keyof Enumeration]: ValueType
};

Честно говоря, я не понимаю до конца, что значит in keyof, а потому буду благодарен за объяснения по этому поводу помимо решения.


Ответы (1 шт):

Автор решения: Daniil Loban

Начну с конца in keyof это цикл по ключам т.е. их перебор таким образом они добавляются в определяемую структуру.

Что касается решения то если я правильно понял суть вот оно.

enum SampleEnum {
  alpha = "FOO",
  bravo = "BAR"
}

enum AnotherSampleEnum {
  alpha = "FOO",
  bravo = "BAR",
  gamma = "EGGS"
}

type DerivedEnum<BaseEnum, ValueType> = {
  [key in keyof BaseEnum]: ValueType
}

const derivedEnum: DerivedEnum<typeof SampleEnum, string> = {
  alpha: '123',
  bravo: '321'
};

const secondDerivedEnum: DerivedEnum<typeof SampleEnum, number> = {
  alpha: 123,
  bravo: 321
};

const thirdDerivedEnum: DerivedEnum<typeof AnotherSampleEnum, number> = {
  alpha: 123,
  bravo: 321,
  gamma: 2
};

Способом type DerivedEnum<BaseEnum, ValueType> мы определяем какие аргументы попадут в наше определение типа, это generic, далее их используем, для того чтобы передать тип enum а не сам enum мы используем typeof

→ Ссылка