Параметрический ввод на основе значения

#typescript

#typescript

Вопрос:

Я пытаюсь создать тип для своих форм. Что-то вроде этого:

 function getCiccio<Values extends Record<string, unknown> = Record<string, unknown>>({
  defaultValue,
  onSubmit
}: {
  defaultValue: Values
  onSubmit: (values: Values) => void
}): {
  value: Values
  onSubmit: (value: Values) => void
} {
  return {
    value: defaultValue,
    onSubmit
  }
}

const a = getCiccio({
  defaultValue: { cane: 1 },
  onSubmit: (a) => { // here a is typed 
    alert(1)
  }
})
 

Я хотел бы, чтобы значение, зависящее от onSubmit функции, мешало initialValue объекту.
Возможно ли это?
Это то, что я делал до сих пор. Но для того, чтобы ввести a onSubmit функцию on, мне нужно вызвать функцию.
Я бы хотел иметь обычный интерфейс вывода.

Комментарии:

1. Под initialValue , вы имели в виду initialValues ? Вы увеличите свои шансы получить ответ, если поделитесь минимальным воспроизводимым примером своего кода

2. готово, я добавил пример

3. Я вообще не вижу переменной initialValue в вашем примере

Ответ №1:

Если вы определяете интерфейс:

 interface Ciccio <T extends Record<string, unknown> = Record<string, unknown>> {
  value: T
  onSubmit( value: T ): void
}
 

Затем вы можете использовать этот интерфейс для автоматического ввода в onSubmit функцию при определении нового объекта:

 const newCiccio: Ciccio <{ cand: number }> = {
  value: { cand: 1 },
  onSubmit: function( arg ) {
    // arg is typed here
  }
}
 

Однако здесь важно указать тип при определении нового значения, если вы хотите, чтобы тип был более конкретным, чем общий и стандартный Record<string, unknown> . Итак, если вам требуется, чтобы тип в onSubmit функции выводился без указания его в качестве аргумента типа при указании интерфейса (т. Е. Если вы хотите заменить Ciccio <{ cand: number }> на simply Ciccio ), я не верю, что это возможно без определения функции, как в вашем первоначальном подходе.

Комментарии:

1. да, я понимаю, что вы говорите. Мы пришли к тому же выводу!