Ваш второй подход выглядит хорошо, за исключением одной мелочи, которая вызывает ошибку: ref
prop of TextareaAutosizeProps
сталкивается с ref
prop вашего стилизованного компонента.
ref
(и key
если на то пошло) является сложной «опорой» - вы передаете ее компоненту, как и любые другие реквизиты, но она не отображается в ваших реквизитах (например, если вы регистрируете их), она обрабатывается по-другому.
Если вы посмотрите на второй пример:
const SecondTry = styled(({ isActive, ...rest }: ExtendedProps) => (
<TextareaAutosize {...rest} />
))`
color: ${({ isActive }) => (isActive ? "red" : "blue")};
`;
, вы увидите, что вы стилизуете не TextareaAutosize
, а анонимный функциональный компонент ({ isActive, ...rest }: ExtendedProps) => ...
. Если вы передадите ref
компоненту SecondTry
, он не будет отображаться в ваших реквизитах ({ isActive, ...rest }: ExtendedProps
). Тем не менее, при расширении TextareaAutosizeProps
вы также говорите, что будет такая опора, и она будет иметь тип HTMLTextAreaElement
.
Так что я могу придумать два решения в зависимости от ваших потребностей:
Если вам не нужна опора ref
на вашем SecondTry
, вы можете просто исключить ее из своих реквизитов:
interface ExtendedProps extends Props, Omit<TextareaAutosizeProps, 'ref'> {}
Если она вам нужна, вам нужно будет использовать функцию React.forwardRef
( подробнее об этом здесь ).