Как сделать параметр условным внутри интерфейса с интерфейсом универсального типа

#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. написал это на самом посту, извини, чувак