#reactjs #typescript #visual-studio-code #react-forwardref
Вопрос:
Для обычных компонентов React я вижу правильное автоматическое завершение для реквизитов компонента, подобных этому:
Но я пытаюсь создать компонент, React.forwardRef
как показано ниже, он не работает, есть идеи?
export default React.forwardRef<unknown, BaseModalProps amp; FeedbackDetailsContentProps>((props: BaseModalProps amp; FeedbackDetailsContentProps, ref) => {
return (
<BaseModal {...props} onlyDisplayOkButton ref={ref} width={600}>
<FeedbackDetailsContent {...props} />
</BaseModal>
);
});
Комментарии:
1. Это должно быть связано с тем, что пользовательские типы компонентов не указаны. Если указаны типы реквизитов ожидаемого компонента, то вы должны увидеть предложения.
2. @sunkehappy, пожалуйста, приведите воспроизводимый пример
Ответ №1:
Вы должны unknown
заменить указанный тип элемента HTML, например. HTMLInputElement
, а также тип, указанный для props
, не нужен.
Комментарии:
1. По крайней мере, они должны иметь возможность получить доступ к правильному типу ссылки с
BaseModalProps['ref']
помощью .
Ответ №2:
На самом деле, ваша проблема не связана с VSCode, я имею в виду проблемы программирования, особенно область разработки вообще не связана с редактором/IDE.
Давайте закодируем так:
type ModalProps = BaseModalProps amp; FeedbackDetailsContentProps;
const Modal = (props: ModalProps, ref: any) => (
<BaseModal {...props} onlyDisplayOkButton ref={ref} width={600}>
<FeedbackDetailsContent {...props} />
</BaseModal>
);
export default React.forwardRef<unknown, ModalProps>(Modal);
Ответ №3:
- Вам не нужно вводить типы два раза. Если вы уже указали типы для generic (внутри
<>
), вам не нужно явно вводить аргументы для пересылки - Скорее всего, вы бы связали ссылку с кнопкой внутри BaseModal, чтобы тип мог быть
HTMLButtonElement
вместо неизвестного. Что давайте наберем типы вывода
export default React.forwardRef<HTMLButtonElement, BaseModalProps amp; FeedbackDetailsContentProps>((props, ref) => {
return (...);
});
или
export default React.forwardRef< BaseModalProps amp; FeedbackDetailsContentProps>(
(
props: BaseModalProps amp; FeedbackDetailsContentProps,
ref: ForwardedRef<HTMLButtonElement>
) => {
return (...);
});