提问者:小点点

useState的数组类型


我有两种使用setstate设置对象数组的情况。 看起来是这样的:

  const [friendList, setFriendList] = useState<any>();

  const _onCompleted = (data: any) => {
    let DATA = data.me.friends.map(
      (item: {
          firstName: string;
          id: number;
          rating: number;
          vehicles: Array<Vehicle>;
          friends: Array<User>;
        
      }) => ({
        id: item.id,
        imageUrl: defaultUrl,
        name: item.firstName,
        rating: item.rating,
        vehicles: [],
        numberOfFriends: item.friends.length,
      }),
    );
    setFriendList(DATA);
  };

如果在onComplete上,数据如下所示:

DATA
Array (3)
0 {id: 1, imageUrl: "https://", name: "Bob", rating: 1, vehicles: [], …}
1 {id: 3, imageUrl: "https://", name: "Rhena", rating: 3, vehicles: [], …}
2 {id: 4, imageUrl: "https://", name: "Jack", rating: 4, vehicles: [], …}

目前,我使用的是,这是可行的。 但是,我不想使用任何。 我尝试创建自定义类型:

type Friend = {
  id: number,
  imageUrl: string,
  name: string,
  rating?: number,
  //vehicles: item.vehicles,
  vehicles?: any,
  numberOfFriends?: number,
};

type FriendList = {
  friendList: Array<Friend>;
};

但是,当我像这样使用它时,usestate();,我在setfriendlist(DATA);上从onerror得到一个错误,即类型为“{id:string;imageurl:string;name:string;}[]”的参数不能分配给类型为“setstateaction>”的参数。

为什么会这样呢? 我的朋友类型中的其余字段是选项,那么为什么会出现此错误呢?

我还尝试使用useState>();useState([]),但我得到了相同的错误。


共2个答案

匿名用户

这应该适用于设置类型-

const [friendList, setFriendList] = useState<Array<Friend>>([]);

此外,在类型-中有多个选项的情况下,可以强制转换类型-

setFriendList(DATA as Array<Friend>);

匿名用户

您的FriendList似乎是FriendList类型,它是{friendList:Array},与Data不同的是Array。 有两种方法可以修复它。

  • friendList更改为Array:const[friendList,setFriendList]=useState>(),并确保您设置了let data:array
  • 更改调用SetFriendList的方式:SetFriendList({FriendList:DATA})

更新:首选使用朋友[]而不是数组:

const [friendList, setFriendList] = useState<Friend[]>();

  const _onCompleted = (data: any) => {
    let DATA: Friend[] = data.me.friends.map(
      (item: {
          firstName: string;
          id: number;
          rating: number;
          vehicles: Array<Vehicle>;
          friends: Array<User>;
        
      }) => ({
        id: item.id,
        imageUrl: defaultUrl,
        name: item.firstName,
        rating: item.rating,
        vehicles: [],
        numberOfFriends: item.friends.length,
      }),
    );
    setFriendList(DATA);
  };