【发布时间】:2018-10-08 11:02:15
【问题描述】:
我正在尝试使用减速器设置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);
}
}
【问题讨论】:
-
有点难以弄清楚发生了什么,因为我没有看到 ApplicationState 和 Case 类。你有什么理由让它们成为类而不是从头到尾使用 Immutable.js 映射?
-
@KevinRaoofi - 我已经在上面添加了这些类。
标签: typescript redux immutable.js