Утилитарный тип "унаследовать ключи перечисления" в 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 шт):
Начну с конца 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