Поток, набирающий универсальный нормализованный селектор свойств Redux - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть нормализованное состояние редукции в форме

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');

У кого-нибудь есть предложения? Вот ссылка на то, на чем я тестировал.

...