请稍等 ...
×

采纳答案成功!

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

关于泛型

interface TestProps {
  _id: string;
  name: string;
}
const testData: TestProps[] = [
  {
    _id: '1',
    name: 'a'
  },
  {
    _id: '2',
    name: 'b'
  }
]
// 转换成
export const arrToObj = <T extends { _id: string }>(arr: Array<T>) => {
  return arr.reduce((prev, cur) => {
    if (cur._id) {
      prev[cur._id] = cur
    }
    return prev
  }, {} as { [key: string]: T })
}

arrToObj(testData)

我理解的泛型是把类型当参数进行传递, 在上面代码中定义了一个TestProps, 里面定义了_id: string, 那为什么cur.id的时候会报错类型“T”上不存在属性“_id”, 如果是_id为一个可选类型, 为什么我不能直接在TestProps中直接定义为_id?: string呢?

正在回答 回答被采纳积分+3

1回答

张轩 2023-06-04 09:29:07

同学你好 不知道我是否理解了你的问题

刚用你的代码试了,

假如你直接在函数内取值 cur._id 是不会报错的啊。并没有出现你说的“类型“T”上不存在属性“_id”,而是可以直接进行取值的。


0 回复 有任何疑惑可以回复我~
  • 提问者 萧萧啊 #1
    我的意思是为什么要加这个extends {_id: String}因为testprops中不是存在_id:String么😂
    回复 有任何疑惑可以回复我~ 2023-06-04 09:38:56
  • 张轩 回复 提问者 萧萧啊 #2
    同学你好 这个是泛型的限制,这么写的意思是说,这个范型里面必须要有这样的结构,也就是说必须要要有 _id 这个属性,并且是 string 类型。和 TestProps 没有关系的。
    回复 有任何疑惑可以回复我~ 2023-06-05 10:04:12
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信