Typescript 对象分解的特殊行为
我有以下资料:Typescript 对象分解的特殊行为,typescript,destructuring,typescript2.7,Typescript,Destructuring,Typescript2.7,我有以下资料: @Action( RsRosCoughUiUpdate ) rsRosCoughUiUpdate( { getState, patchState }: StateContext<IRs>, payload: IFormState ) { console.log( `classToPlain(payload) | ${JSON.stringify( classToPlain(payload) ) }` ) console.log('PAYLOAD
@Action( RsRosCoughUiUpdate )
rsRosCoughUiUpdate( { getState, patchState }: StateContext<IRs>, payload: IFormState ) {
console.log( `classToPlain(payload) | ${JSON.stringify( classToPlain(payload) ) }` )
console.log('PAYLOAD', payload)
console.log('PAYLOAD STATUS', payload.status)
console.log('PAYLOAD STATUS', payload['status'])
console.log( `change-before | ${JSON.stringify( payload.change ) }` )
console.log(classToPlain(payload))
console.log( `change-after | ${JSON.stringify( payload.change ) }` )
let {change, dirty, pristine, status, target, touched, untouched} = payload
console.log(change, dirty, pristine, status, target, touched, untouched)
const nextState = produce( getState(), draftState => {
let {change, dirty, pristine, status, target, touched, untouched} = payload
console.log( `change | ${JSON.stringify( payload.change ) }` )
// draftState.ros.ui.cough = payload
// draftState.ros.ui.cough = {...payload}
// draftState.ros.ui.cough.change = payload.change
// draftState.ros.ui.cough.dirty = payload.dirty
// draftState.ros.ui.cough.pristine = payload.pristine
// draftState.ros.ui.cough.status = payload.status
// draftState.ros.ui.cough.target = payload.target
// draftState.ros.ui.cough.touched = payload.touched
// draftState.ros.ui.cough.untouched = payload.untouched
} )
patchState( { ...getState(), ...nextState } )
}
删除所有调试信息并执行console.logpayload会产生以下结果
问题:
1.为什么解构值总是未定义?
2.为什么负载对象图的点遍历总是未定义
干杯如我的评论所示,您可以在这里看到问题:
console.log('PAYLOAD', payload);
现在,如果检查控制台结果,您将获得以下日志:
rs.store.ts:73 PAYLOAD RsRosCoughUiUpdate {payload: FormState}.
它说payload是一个rsroscouguiudpate,一个具有FormState类型的payload属性的对象。我假设FormState是一种符合您的FormState接口的类型
因此,当然:
console.log(payload.change);
显示未定义的
要获取您的值,您的分解应该是:
let {change, dirty, pristine, status, target, touched, untouched} = payload.payload
也许您应该更改有效负载变量的名称,因为它不是您认为的那样。不能确定。。。但在我看来,您想要的负载不是可变负载,而是负载。payload@Gerrit0以前尝试过,但没有多大成功。它错误地说有效负载不是IFormState上的属性。请看我刚才添加的图形。Cheers IFormState定义没有名为payload的属性并不意味着变量payload没有。当然,根据IFormState的定义,TypeScript可能会提出抗议,但是,有效负载值从何而来?服务?可能您没有得到预期的结果,因此,要么出现TypeScript编译错误,要么在运行时未定义属性。请记住,接口只是告知编译器数据结构的一种方式,它本身并不真实。如果定义错误,您会得到意想不到的结果伟大的分析!你说得太对了。有效负载的类型为RSROSCOUGUIUPDATE,包含类型为IFormState的实际有效负载。我将重新命名以纠正混淆。谢谢
let {change, dirty, pristine, status, target, touched, untouched} = payload.payload