Для этого вы можете использовать тип-объединение (union type) из двух или более объектных типов, которые отражают разные сценарии использования вашего компонента. Каждый объектный тип должен содержать общие пропсы и уникальные пропсы для данного сценария. Вы также можете использовать тип never для тех пропсов, которые не должны быть заданы в определенном сценарии.
Например, вы можете определить тип TProps таким образом:
interface CommonProps {
// ...общие пропсы, которые всегда существуют
slasskane?: string;
title?: string;
onselect: (number: number) => void;
selector: number;
}
type TProps =
| {
// если isOpen не задан или false, то onClose и onSubmit не должны быть заданы
isOpen?: false;
onClose?: never;
onSubmit?: never;
onChangeFeedback?: never;
feedback?: never;
}
| {
// если isOpen = true, то onClose и onSubmit становятся обязательными
isOpen: true;
onClose: Function;
onSubmit: (data: any) => void;
onChangeFeedback?: (feedback: string) => void;
feedback?: string;
};
Теперь вы можете использовать тип TProps для вашего компонента и TypeScript будет проверять, что вы не передаете неверные пропсы в зависимости от значения isOpen.
Этот подход называется “дискриминированным объединением” (discriminated union) и он часто используется для создания условных пропсов в TypeScript и React
Просто сейчас мне приходится делать все поля не обязательными, и из-за этого в коде (2картинка) возникают проблемы, и приходится добавлять больше проверок, а хотелось бы просто дополнить тип если isOpen пришел