У меня есть нормализованное состояние редукции в форме
const store = { data: { byId: {...}, allIds: [...] } }
Как таковая, у меня есть функция selectData
для каждой части моего состояния.
const selectData = (state: TState, id: TId): TData => state.data.byId[id]
Я хочу создатьтипизированный selectDataProperty
получает доступ как одно свойство данных и принимает только допустимые свойства в качестве входных данных.
const selectDataProperty = <P: $Keys<TData> >
(state: TState, id: TId, property: P): $ElementType<TData, P> =>
(selectData(state, id)[property]: any)
Я хочу создать HOF с параметризованным обобщением, чтобы сгенерировать их для каждой части магазина, но не могу заставить его работать.У кого-нибудь есть предложения?Я пробовал несколько разных подходов, но не могу заставить набирать текст для работы.Вот что у меня есть
// DataType will always be an object
const createSelectProperty = <DataType>(selector: (TState, TId) => DataType) =>
<P: $Keys<Data>>(state: TState, id: TId, property: P): $ElementType<DataType, P> =>
const data = selector(state, id) || {};
return (data[property]: any)
const selectDataProperty = createSelectProperty<TData>(selectData);
// This should pass
selectDataProperty(state, id, 'realProperty');
// This should error
selectDataProperty(state, id, 'fakeProperty');
У кого-нибудь есть предложения? Вот ссылка на то, на чем я тестировал.