У меня есть собственный элемент формы, для его типа требуется составной аргумент, при его передаче форма будет формой FormData, если нет, то это будет форма JSON, и я хочу сделать это следующим образом:
<CustomForm<DataFields> ...arguments> (JSON FORM)
...
</CustomForm>
<CustomForm<DataFields> multipart ...arguments> (MULTIPART FORM)
...
</CustomForm>
но на самом деле, когда я делаю первый (форма JSON), появляется ошибка ввода, вместо этого мне нужно сделать это:
<CustomForm<DataFields> multipart = {false} ...arguments> (JSON FORM)
...
</CustomForm>
Это ошибка, которую я получаю:
Type '{ children: Element[]; onSubmit: () => void; }' is not assignable to type 'IntrinsicAttributes & CustomFormProps<FieldValues>'.
Property 'multipart' is missing in type '{ children: Element[]; onSubmit: () => void; }' but required in type '{ multipart: false | void | null | undefined; onSubmit: (data: FieldValues) => void; }'.ts(2322)
form.ts(12, 2): 'multipart' is declared here.
Сначала мой тип выглядел так:
type CustomFormProps<T extends any> = {
children?: ReactNode | ReactNode[]
setMethods?: Function
className?: string
} & ({
multipart: true
onSubmit: (data: FormData) => void
} | {
multipart: false
onSubmit: (data: T) => void
})
Затем я подумал: «Хорошо, это должно быть потому, что, когда я не передаю никакого значения, свойство multipart получает «неопределенное»», поэтому я изменил его на это:
type CustomFormProps<T extends any> = {
children?: ReactNode | ReactNode[]
setMethods?: Function
className?: string
} & ({
multipart: true
onSubmit: (data: FormData) => void
} | {
multipart: false | undefined | null | void
onSubmit: (data: T) => void
})
Но это тоже не сработало. Что мне нужно сделать, чтобы это исправить?
Для второй части вашего дискриминируемого объединения вам нужно сделать multipart
необязательным свойством.
| {
multipart?: false;
onSubmit: (data: T) => void;
}
Вот пример codeandbox, где компилятор Typescript определяет тип onSubmit
для <CustomForm/>
с опущенным реквизитом.
Большое спасибо! Не знаю, как я не подумал об этом раньше, спасибо!