我具有形式为
的归一化redux状态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');