如何声明ts类型可以支持参数具有任意类型属性值?

import set from 'lodash/set'

state = {
  a: 'a',
  b: [1,2,3]
  c: {
    d: [
      {e: 5}
    ]
  }
  // ...很多不同深度的属性
}

// 这里的any如何声明才能支持state任意类型属性的修改?
setStateWithPathList: (actions:{[key: string]: any}) => {
  Object.keys(action).forEach(key => {
    const val = action[key]
    set(state, key, val)
  }) 
}

// 执行
setStateWithPathList({
  a: '',
  b: [],
})

// 报错
阅读 2.4k
1 个回答

可以参考[TS object types]


function keys<O extends object>(obj: O): Array<keyof O> {
    return Object.keys(obj) as Array<keyof O>;
}
function setStateWithPathList(actions:Object)  {
    for (const key of keys(actions)) {
        const val = actions[key]
        console.log('VAL:',val)
    }
}

setStateWithPathList({
  a: 'a',
  b: [1,2,3],
  c: {
    d: [
      {e: 5}
    ]
  }
})

测试:

VAL: a
VAL: (3) [1, 2, 3]
VAL: {d: Array(1)}
已参与了 SegmentFault 思否「问答」打卡,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题