首页 > 解决方案 > 获取地图返回对象的类型。打字稿 ts(2345)

问题描述

我有一个使用该any类型的代码,请检查注释//HERE TYPE ANY:我需要它才能将数据推送到该数组中,因为您可以在下面的代码中看到该//NEED ANY TYPE TO PUSH INTO THE ARRAY行。

const ProjectList = () => {
  const [projects, setProjects] = useState<IFirebaseProject[]>();
  useEffect(() => {
    let data:any[] = []; //HERE TYPE ANY
    firebase
      .firestore()
      .collection("projects")
      .onSnapshot((snapshot) => {
        let changes = snapshot.docChanges();
        changes.forEach(change => {console.log(change.doc.data())})
        const fbProjects = changes.map( (change) => ({
          id: change.doc.id,
          ...change.doc.data()
        }));
        fbProjects.forEach(fbProject => data.push(fbProject)) //NEED ANY TYPE TO PUSH INTO THE ARRAY
        setProjects([...data]);
      });
  }, []);

我的问题是我无法为代码的特定部分强制执行类型(尽管我知道):

const fbProjects = changes.map( (change) => ({
    id: change.doc.id,
    ...change.doc.data() 
}));

我知道由 获得的类型...change.doc.data(),但是如何强制执行我的类型,以便fbProjects满足我定义的确定类型?

这是 的类型fbProjects

interface IFirebaseProject {
  id: string,
  authorFirstName: string,
  authorId: string,
  authorLastName: string
  content: string
  createdAt: Date
  title: string
}

所以它有 id 属性,我知道它...change.doc.data()有其余的属性。

如果我使用 myIFirebaseProject而不是any我在将项目推送到数组 ( fbProjects.forEach( fbProject => data.push(fbProject))) 时会出现错误,因为显然不符合类型。

我得到的错误是: Argument of type '{ id: string; }' is not assignable to parameter of type 'IFirebaseProject'. Type '{ id: string; }' is missing the following properties from type 'IFirebaseProject': authorFirstName, authorId, authorLastName, content, and 2 more.ts(2345)

编辑:控制台输出:

在此处输入图像描述

(使用 记录的数据库中每个寄存器的其中一个对象.forEach

标签: typescript

解决方案


您可以告诉 TypeScript 将返回的对象map视为IFirebaseProject

const fbProjects = changes.map((change) => ({
  id: change.doc.id,
  ...change.doc.data()
}) as IFirebaseProject);

推荐阅读