Возможность TypeScript использовать значение типа и получать другое значение путем отключения карты типа/интерфейса.

type ListThemes =
  | "projects"
  | "data"
  | "alerts"
  | "jobs";

type ListDataType = {
  projects: ProjectListFieldsTypeMap;
  data: DataListFieldsTypeMap;
  alerts: AlertsListFieldsTypeMap;
  jobs: JobListFieldsTypeMap;
};

type ListProps = {
  theme: ListThemes;
  data: DERIVED_TYPE_HERE;
};

DERIVED_TYPE_HERE будет значением ListDataType[theme]

Предпринимали попытки более непосредственно связать ListThemes с ключами в ListDataType, но не смогли этого сделать и все же напрямую создать отношение 1:1.

так что в основном вы хотите, если theme это "alerts", то тип "data" это AlertsListFieldsTypeMap и т. д. и т. д.?

bryan60 09.04.2022 21:40

И чему должен соответствовать "entities"?

jcalz 09.04.2022 21:45

Предоставьте минимальный воспроизводимый пример, который четко демонстрирует проблему, с которой вы столкнулись. В идеале кто-то может вставить код в автономную IDE, такую ​​как Площадка TypeScript (ссылка здесь!), и сразу же приступить к решению проблемы, не создавая ее заново. Таким образом, не должно быть псевдокода, опечаток, несвязанных ошибок или необъявленных типов или значений.

jcalz 09.04.2022 21:46
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
0
3
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

что-то вроде этого с дженериками может достичь вашей цели, когда я это читаю:

type ListProps<T extends ListThemes> = {
  theme: T;
  data: ListDataType[T];
};

и вы также можете сжать его и избавиться от типа ListThemes, например:

type ListProps<T extends keyof ListDataType> = {
  theme: T;
  data: ListDataType[T];
};

но это не будет работать с кодом, который вы указали, поскольку GraftListThemes не определен, поэтому я не уверен, на что он ссылается, и entities не сопоставляется ни с чем в ListDataType.

Другие вопросы по теме