Создайте тип для родительского реквизита HOC в зависимости от существующих дочерних свойств

Я делаю компонент высокого порядка (HOC) для @expo/vector-icons и пытаюсь определить общий тип его реквизита. Внутри модуля есть несколько источников иконок components (MaterialCommunityIcons, MaterialIcons, FontAwesome и т. д.), и все они имеют одинаковую форму, но уникальные литеральные типы для иконки names.

Итак, HOC должен получить два реквизита: источник component и значок name. Идея в том, что когда component определен, реквизит name должен выводить соответствующий список доступных имен для выбранного источника. Моя попытка выглядит так:

const IconLibs = { MaterialCommunityIcons, MaterialIcons, FontAwesome };

type IconLibsNames = keyof typeof IconLibs;

type HocProps<Key extends IconLibsNames> = {
    component: typeof IconLibs[Key];
    name: React.ComponentProps<typeof IconLibs[Key]>["name"];
};

В моем результате я вижу, что все names собираются в общий список и все они доступны для каждого источника component. Как их правильно разделить?

Если это было бы полезно, буквенный тип подходящего component names (например, "stop" | "forward" | "check" | "close" | "book" ...) можно было бы использовать двумя способами:

1.

type name = React.ComponentProps<typeof MaterialIcons>["name"]
type name = keyof typeof MaterialIcons.glyphMap
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему &apos;[] instanceof Object&apos; возвращает &quot;true&quot;?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
1
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я думаю, проблема в том, что вы пытались вывести имя, используя общий + typeof. Я бы рекомендовал использовать более простой подход:

const IconLibs = { MaterialCommunityIcons, MaterialIcons, FontAwesome };

type IconComponent = typeof IconLibs[keyof typeof IconLibs]

type HocProps<TComponent extends IconComponent> = {
    component: TComponent;
    name: React.ComponentProps<TComponent>['name']
};


const hoc = <TComponent extends IconComponent>({name, component}: HocProps<TComponent>) => {
  // implementation of hoc
}

hoc({component: FontAwesome, name: '...'}) // `name` will be inferred from the FontAwesome

Работает отлично. Спасибо Плоский глобус. Осталось придумать как)))

Sander 18.02.2023 01:01

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