Как правильно использовать дженерик в компоненте?

Есть компонент, который должен работать с произвольным 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)
     }}
/>


Может, можно как-то поизящней?
  • Вопрос задан
  • 87 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы