#reactjs #typescript #typescript-typings #typescript-generics
#реагирует на #машинописный текст #машинопись-наброски #типографские шрифты-дженерики
Вопрос:
Я пытаюсь создать интерфейс, например, раскрывающийся интерфейс реквизитов для компонента React, и я пытаюсь сделать параметры необязательными, только если T generic-строка. Мое исследование не нашло ответов на мой вопрос.
как вы можете видеть здесь, я пытаюсь сделать getTemplate необязательным, только если T расширяет тип строки, но если это что-то другое, мне придется его написать.
К сожалению, это не работает. параметр с неопределенным типом не является необязательным параметром, это параметр с неопределенным типом.
Есть какие-нибудь предложения? Заранее спасибо.
вот пример того, что я пробовал, но не работает:
type Propslt;T extends string | Omitlt;any, 'string'gt;gt; = (T extends string ? {} : { getTemplate: (item: T) =gt; ReactNode; getDisplayTemplate(item: T): ReactNode; getItemIdentifier(item: T): string | number; }) amp; { items: Arraylt;Tgt;; disabled?: boolean; className?: string; placeholder?: string; selectedItems: Arraylt;Tgt;; isMultiSelect?: boolean; onChange(items: Arraylt;Tgt;): void;
};
export const Dropdown = lt;T,gt;({ disabled, placeholder, selectedItems = [], items, onChange, getDisplayTemplate, getItemIdentifier, getTemplate, isMultiSelect, className,
}: Реквизит) =gt; {
Комментарии:
1. Пожалуйста, вставьте свой исходный код в следующий раз вместо использования изображения.
2. Отмечено, спасибо будет сделано в следующий раз. Я отредактирую сообщение прямо сейчас
Ответ №1:
Возможно, извлечь условную часть в член типа объединения. Make getTemplate
и т. Д. Необязательно , только если T
это строка.
type ConditionalPropslt;Tgt; = { getTemplate: (item: T) =gt; ReactNode; getDisplayTemplate(item: T): ReactNode; getItemIdentifier(item: T): string | number; }; type Propslt;Tgt; = (T extends string ? Partiallt;ConditionalPropslt;Tgt;gt; : ConditionalPropslt;Tgt;) amp; { items: Arraylt;Tgt;; disabled?: boolean; className?: string; placeholder?: string; selectedItems: Arraylt;Tgt;; isMultiSelect?: boolean; onChange(items: Arraylt;Tgt;): void; };
Комментарии:
1. Спасибо за комментарий, я пробовал, но я думаю, что это тоже не работает. Я не могу извлечь функции, когда использую компонент
2. @EdenBinyamin Трудно помочь вам, не видя кода и фактической ошибки , но если вы введете реквизиты с параметром типа, например
props: Propslt;MyClassgt;
, вы сможете получить доступprops.getTemplate
.3. написал это на самом посту, извини, чувак