我正在尝试使用还原器设置state.case.summaries.get(action.summary.id).metadata.summaryRank
的值。summaries
是Immutable.Map<string, Summary>;
我已经尝试过:
return {
...state,
'case' : {
...state.case,
summaries : {
...state.case.summaries,
[action.summary.id] : {
...state.case.summaries.get(action.summary.id),
metadata : {
...state.case.summaries.get(action.summary.id).metadata,
summaryRank : action.newRank
}
}
}
}
};
但是我正在失去我的类型:
`state` before:
ApplicationState {_map: Map, __ownerID: undefined}
after:
{_map: Map, __ownerID: undefined, case: {…}}
`case` before:
Case {_map: Map, __ownerID: undefined}
after:
{_map: Map, __ownerID: undefined, summaries: {…}}
`summaries` before
Map {size: 44, _root: HashArrayMapNode, __ownerID: undefined, __hash: undefined, __altered: false}
after
{size: 44, _root: HashArrayMapNode, __ownerID: undefined, __hash: undefined, __altered: false, …}
所以,如果我稍后尝试做summaries.get(summaryId)
,我最终会得到applicationState.case.summaries.get is not a function
然后我尝试这样做:
return state.set('case',
state.case.set('summaries',
state.case.summaries.get(action.summary.id).set(//not sure what to do here
state.case.summaries.get(action.summary.id).set('metadata',
state.case.summaries.get(action.summary.id).metadata.set('summaryRank',
action.newRank
)
)
)
)
);
但是我得到了:
[exec]
[exec] 46 state.case.summaries.get(action.summary.id).set(
[exec] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[exec] 47 state.case.summaries.get(action.summary.id).set('metadata',
[exec] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[exec] ...
[exec] 51 )
[exec] ~~~~~~~~~~~~~~~~~~~~~~~~~
[exec] 52 )
[exec] ~~~~~~~~~~~~~~~~~~~~~
[exec]
[exec] .../services/store/caseReducer.ts(46,21): error TS2346: Supplied parameters do not match any signature of call target.
[exec]
更多信息
case.ts
const CaseRecord = Immutable.Record({
id: '',
reserved:false,
loaded: false,
summaries: Immutable.Map<string, Summary>(),
caseMetadata: new models.CaseMetadata(),
});
export class Case extends CaseRecord {
public id: string;
public loaded: boolean;
public reserved: boolean;
public summaries: Immutable.Map<string, Summary>;
public caseMetadata: models.CaseMetadata;
constructor(properties?: any) {
super(properties);
}
public asMutable(): Case {
let record = <Case>super.asMutable();
record.summaries = this.summaries.asMutable();
this.summaries.forEach((summary) => {
record.summaries = record.summaries.set(summary.id, <models.Summary>summary.asMutable());
});
record.caseMetadata = this.caseMetadata.asMutable();
return record;
}
}
applicationstate.ts
const ApplicationStateRecord = Immutable.Record({
case: new models.Case(),
lookupValues: {}
});
export class ApplicationState extends ApplicationStateRecord {
public case: models.Case;
public lookupValues: LookupValues;
constructor(properties?: any) {
super(properties);
}
}
在Redux Store中使用类类型请小心 - 您必须确保您不使用普通JS对象。
做类似:
的事情return { /* stuff */ }
Redux无法确定您将其从另一种类型中得出。您可以应用原始原型,例如:
return Object.assign(new ApplicationState(), { /* stuff */ })
但是,当有很多嵌套时,这很乏味。
值得庆幸的是,似乎您一直在使用不变的东西,这使更新嵌套类型变得相当容易。我相信您可以做:
return state.setIn(
['case', 'summaries', action.summary.id, 'metadata', 'summaryRank'],
action.newRank
)
这也将根据需要根据需要创建键。