请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

泛型第一次赋值就确定了,第二次就有类型限制了

图片描述
图片描述
这里他说 string[] | number[]类型的参数不能赋值给string[]类型的参数。我看不懂他的这个错误是啥意思诶,我好像并没有给她string[] | number[] 类型啊,是因为它第一次获取到string[]的时候,T就具象化为string[]了嘛,这种情况应该怎么解决啊,我把arry类型变成any的话,返回值的类型就是两个unkonw了。不知道咋办比较好

正在回答

插入代码

3回答

这是目前 工作中 TS 对象备份最好的方法了! 我提供的这种方案即避免了错误,而且具有通用性!把这段代码封装起来就可以变成一种通用写法,这才是关键!你可以自己试试其他方法,对比下,不是有错误,就是提出来不方便!

1 回复 有任何疑惑可以回复我~
  • 提问者 小鹏友的小弟 #1
    这样嘛,那看来Ts对代码的书写,还是有些限制的呀
    回复 有任何疑惑可以回复我~ 2021-11-03 23:28:08
  • keviny79 回复 提问者 小鹏友的小弟 #2
    这是一种良性的限制,大多数情况下,TS 通过适当的增加类型检查代码 保证了 代码在开发期间的安全性,避免推迟到运行甚至上线也可能的暴漏出来问题,那就严重了,当开发大项目时,这种问题可能是灾难性的
    回复 有任何疑惑可以回复我~ 2021-11-04 10:32:33
  • 提问者 小鹏友的小弟 #3
    非常感谢!
    回复 有任何疑惑可以回复我~ 2021-11-04 15:29:31
keviny79 2021-11-02 15:36:44

//   我提供解决方案如下:我提供完整通用性的实现的方案,你可以先对老师的答案思考下,留一个思考的空间给你!

const hasOwnProperty = Object.prototype.hasOwnProperty

export const hasOwn = (

  val: object,

  key: string | symbol

): key is keyof typeof val => hasOwnProperty.call(val, key)



const GetSlaParams = <T extends object>(data_: T) => {


  let copyData = {}

  for (let key in data_) {

    if (hasOwn(data_, key)) {

      console.log(key)

      copyData[key] = data_[key]

    }

  }

  return Object.keys(copyData).map((key) => {

    if (hasOwn(copyData, key)) {

      return formatSlectObjList(copyData[key])

    }

    return {}

  })

}

const formatSlectObjList = <T>(arr: T[]): { label: T, value: T }[] => {

  const value = arr.map((item: T) => {

    return { label: item, value: item }

  })

  return value

}


let result = GetSlaParams(data)

console.log("result:", result)



0 回复 有任何疑惑可以回复我~
  • 提问者 小鹏友的小弟 #1
    我思考了上面的这个代码表达的意思,之前报错的代码之所以报错,是因为语言检测知道具体的类型,上面这种写法,就是全都用泛型来指定,没有固定的类型,所以就不会有上面的错误了
    回复 有任何疑惑可以回复我~ 2021-11-03 10:16:57
  • 提问者 小鹏友的小弟 #2
    但是这种写法,不就让代码显得更加的长,而且一段的代码只是为了避免类型错误,难道真实工作中的代码也是通过这种方式来避免吗
    回复 有任何疑惑可以回复我~ 2021-11-03 10:19:17
  • keviny79 回复 提问者 小鹏友的小弟 #3
    这是目前 工作中 TS 对象备份最好的方法了! 我提供的这种方案即避免了错误,而且具有通用性!把这段代码封装起来就可以变成一种通用写法,这才是关键!你可以自己试试其他方法,对比下,不是有错误,就是提出来不方便!
    回复 有任何疑惑可以回复我~ 2021-11-03 23:18:15
keviny79 2021-11-02 15:33:38

// 错误原因,这个解决方案解决不了你的问题,我发一个解决方案,我提供完整实现的方案,你可以先对老师的答案思考下,留一个思考的空间给你!

const GetSlaParams = async () => {

  const copyData = data

  type keyType = keyof typeof copyData

  let arr = (Object.keys(data) as keyType[])

  formatSlectObjList(data["date"])   // 单独string[]没问题

  formatSlectObjList(data["sre_uid"])//  单独number[]没问题

  return arr.map(key => {

    //1 错误原因: 这是 TS 处理 map 泛型机制引起的,记住规律即可

    // 1.1 对于实参这样来处理:

    // 编译期间 在 map 内部会这样来处理实参 data[key]

    //    把 所有的 data[key] 中的类型全部联合起来

    //  合成联合类型-> (string |number) []

    //

    //  1.2 但对于形参接受并不能一下全部接受,只能一个一个的接受

    //  这样先传入进去的为string[], 这就导致形参和实参类型不一致

    formatSlectObjList(data[key])

  })

}


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号