Я использую React 16 и Typescript 3. Я создаю компонент, который возвращает кнопку или ссылку в зависимости от того, установлено свойство до или нет. Компонент может получить либо свойство - , либо onClick , оно не может принимать оба значения.
Я обнаружил проблему в репозитории TypeScript , которая точно описывает мою проблему, и кажется, что она исправлена в версии 2.2, но каким-то странным образом она не работает.
Для этого я создал интерфейсы и использую их следующим образом:
interface GeneralProps {/* whatever here, it works */}
interface LinkProps extends GeneralProps { to: string }
interface ButtonProps extends GeneralProps {
onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void
// onClick might be as well undefined
}
function Button (props: LinkProps | ButtonProps): JSX.Element {
const Component: AnyStyledComponent = props.to ? Link : Button
return (
<Component to={props.to} onClick={props.onClick}>
{props.children}
</Component>
)
}
В качестве альтернативы я также попытался написать эту функцию следующим образом:
function Button (props: LinkProps): JSX.Element
function Button (props: ButtonProps): JSX.Element {
const Component: AnyStyledComponent = props.to ? Link : Button
return (
<Component to={props.to} onClick={props.onClick}>
{props.children}
</Component>
)
}
Первая реализация функции Button, приведенной выше, выбрасывает обе ошибки, вторая - только первую:
Свойство 'to' не существует для типа 'LinkProps | ButtonProps. Свойство «to» не существует для типа «ButtonProps».
Свойство 'onClick' не существует для типа 'LinkProps | ButtonProps. Свойство «onClick» не существует для типа «LinkProps».
Чтобы избежать ошибок, я пришел с глупым обходным путем:
function Button (props: LinkProps | ButtonProps): JSX.Element {
const properties = Object.keys(props)
const to = properties.find((el) => el === 'to')
const Component: AnyStyledComponent = to ? Link : Button
return (
<Component {...props}>
{props.children}
</Component>
)
}
Однако это не решает мою проблему, потому что я все еще могу передать оба свойства в и onClick компоненту Button.
Есть ли в моем коде какая-то ошибка, которая мешает мне достичь своей цели, должен ли я подойти к этой проблеме под другим углом или это просто невозможно сделать?