Избегайте определения типа значения объекта с помощью обобщений

#typescript #typescript-generics

#typescript #typescript-обобщения

Вопрос:

Давайте рассмотрим следующие типы, например, где я хочу иметь возможность определять свой пользовательский объект, где ключ — это имя флага, а значение — тело флагов.

 interface FlagModel {
    value: boolean;
}

interface GenericFlagsModel<T extends Record<string, FlagModel>> {
    flags: T
}

enum FLAG_NAMES {
    FLAG_FOO = 'flag-foo',
    FLAG_BAR = 'flag-bar'
}


type CustomFlagsModel = GenericFlagsModel<{
    [FLAG_NAMES.FLAG_FOO]: FlagModel,
    [FLAG_NAMES.FLAG_BAR]: FlagModel
}>
  

Глядя на CustomFlagsModel , вы можете видеть, что мне нужно явно определить FlagModel как значение. Можно ли этого избежать? Например, как:

 type CustomFlagsModel = GenericFlagsModel<{
    [FLAG_NAMES.FLAG_FOO],
    [FLAG_NAMES.FLAG_BAR]
}>
  

Ответ №1:

Соответствует ли следующее вашим потребностям?

 type CustomFlagsModel = GenericFlagsModel<Record<FLAG_NAMES, FlagModel>>
  

Комментарии:

1. Я обнаружил, что вам не нужно использовать OR для этого. Достаточно перечисления. Record<FLAG_NAMES, FlagModel>