Общий тип в Typescript - PullRequest
       8

Общий тип в Typescript

0 голосов
/ 30 сентября 2019

У меня проблемы с пониманием приведенного ниже кода из redux-form

export type DataSelector<FormData = {}, State = {}> = (formName: string, getFormState?: GetFormState) => (state: State) => FormData;

export const getFormValues: DataSelector;

// mapState
const values = getFormValues("formName")(state) // {}
return { form: values }


Среда IDE выдает ошибку, что values возвращает {}. Что ожидается, потому что State = {}. Тем не менее, я хочу использовать доступ values.name. Есть ли способ пройти в FormData или State?

1 Ответ

0 голосов
/ 30 сентября 2019

const getFormValues: DataSelector всегда устанавливает тип по умолчанию {} для параметров универсального типа FormData и State, так как функция не передает эти параметры потребителям.

Обычный способ решенияПроблема типа с участием сторонней библиотеки: Если вы не можете ее контролировать, оберните ее. То есть определите свою собственную функцию, которая оборачивает функцию libary и сужает до нужных типов проектов.

// your own types
type MyFormData = { baz: string };
type MyState = {foo: number};

function getFormValuesWrapper(state: MyState): MyFormData {
  return getFormValues("formName")(state) as MyFormData;
}

// or keep it generic
function getFormValuesWrapper2<FormData, State>(state: State){
  return getFormValues("formName")(state) as FormData
}

const values = getFormValuesWrapper(state);
values.baz // (property) baz: string

Playground

...