Я пытаюсь создать компонент React с условными реквизитами, используя конвейерный тип между двумя интерфейсами. У меня это настроено так:
interface BaseProps {
"aria-label"?: string;
className?: string;
onClick?: () => void;
}
interface IconProps extends BaseProps {
"aria-label": string;
children: never;
icon: React.ReactElement;
}
interface ButtonProps extends BaseProps {
children: React.ReactElement;
}
type Props = ButtonProps | IconProps;
class Button extends React.Component<Props> {
render(): React.ReactElement {
const { children, icon, ...rest } = this.props;
// ERROR: "Property 'icon' does not exist on type '(Readonly<ButtonProps> & Readonly<{ children?: ReactNode; }>) | (Readonly<IconProps> & Readonly<{ children?: ReactNode; }>)'."
}
}
Кажется, я не могу понять, как добиться следующего:
- Когда есть опора «значок», принудительно "aria-label" и запретить дочерние элементы
- Если отсутствует свойство «icon», принудительно использовать дочерние элементы и разрешить необязательный параметр «aria-label»