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

前端小白
  • 20
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: [],
})

// 报错
回复
阅读 186
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 思否「问答」打卡,欢迎正在阅读的你也加入。
你知道吗?

宣传栏