Есть компонент, который должен работать с произвольным Map. Я пробовал сделать так:
type FormProps<T> = {
onSubmit: (payload: T) => void
}
const Form = <T,>({onSubmit}: FormProps<T>) => {
const [formData, setFormData] = useState<T>(new Map())
const formSubmit = (e: FormEvent) => {
e.preventDefault()
onSubmit(formData)
}
}
Но в строке
const [formData, setFormData] = useState<T>(new Map())
линтер ругается на new Map() в useState -
(Argument of type 'Map' is not assignable to parameter of type 'T | (() => T)'.)
Пробовал также в таком духе:
const Form = <T extends Map<string, string>>({onSubmit}: FormProps<T>)
Но всё равно ругается. Как тут надо правильно поступить? T - всегда будет Map, но сами наборы полей будут разные.
Кроме того, не понимаю, как указать тип дженерика при монтировании в родительском компоненте.
<Form onSubmit={(payload) => registration(payload)}/>
Где именно и как именно тут нужно указать конкретный тип?
Update. Пока сделал вот так, но какое-то кривоватое, наверное, решение
const Form = <T extends Map<string, string>>({onSubmit}: FormProps<T>) => {
const [formData, setFormData] = useState<T>(new Map() as T)
}
Теперь и в операциях присвоения значения приходится писать этот as:
<input
type={value.type}
placeholder={schema.locales.ru[key]}
onInput={(event: FormEvent<HTMLInputElement>) => {
setFormData(new Map(formData.set(key, event.currentTarget.value)) as T)
}}
/>
Может, можно как-то поизящней?