Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

(TypeScript - React) Дополнить type если пришел prop параметр

GlebKodrik Ученик (40), на голосовании 1 год назад
Если у меня isOpen = true, то тогда onClose, onSubmit и т.д становятся обязательным (1картинка)
Просто сейчас мне приходится делать все поля не обязательными, и из-за этого в коде (2картинка) возникают проблемы, и приходится добавлять больше проверок, а хотелось бы просто дополнить тип если isOpen пришел
Голосование за лучший ответ
ima family Знаток (496) 1 год назад
Для этого вы можете использовать тип-объединение (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
Похожие вопросы