next.js React TypeScript:使用Props解决类型错误

3htmauhk  于 12个月前  发布在  React
关注(0)|答案(2)|浏览(95)

我一直在为一个投资组合网站使用TypeScript进行Next.js项目。在我的Home功能组件中,我试图使用useState钩子初始化状态,并从组件的props设置初始值。组件签名看起来像:

type Props = {

  pageInfo: PageInfo;
  experiences: Experience[];
  skills: Skill[];
  projects: Project[];
  socials: Social[];

};

export default function Home(props: Props){

const [pageInfo, setPageInfo] = useState<PageInfo>(props.pageInfo);
const [experiences, setExperiences] = useState<Experience[]>(props.experiences);
const [skills, setSkills] = useState<Skill[]>(props.skills);
const [projects, setProjects] = useState<Project[]>(props.projects);
const [socials, setSocials] = useState<Social[]>(props.socials);

  useEffect(() => {
    async function fetchData() {
      if (!projects || projects.length === 0) setProjects(await fetchProjects());
      if (!socials || socials.length === 0) setSocials(await fetchSocials());
      if (!skills || skills.length === 0) setSkills(await fetchSkills());
      if (!experiences || experiences.length === 0) setExperiences(await fetchExperiences());
      if (!pageInfo || Object.keys(pageInfo).length === 0) setPageInfo(await fetchPageInfo());
      
    }
    
    fetchData();

  }, []);

字符串
当尝试使用vercel编译和部署时,我遇到了一个与props类型相关的TypeScript错误。
这里是错误
第一个月
有什么不同的方法,我可以初始化这些 prop 在家里,并有他们传递到不同的功能组件。
目前,代码在运行'npm run dev'时进行编译,但使用vercel时,构建是使用'npm run build'运行的,我得到了类型错误。
理想情况下,我想使用GetStaticProps或GetServerSideProps,然而,next.js的page.tsx文件位于src/app路由器目录中。如果我将其从src目录中移出,并将其放入单独的pages目录中,我会得到404 page not found错误(即使在重建后)。

uurity8g

uurity8g1#

你能像这样修改你的函数吗?

export default function Home(props: Props){ ... }

字符串
相反

export const Home:React.FC<Props> = (props) > { ... }

f0ofjuux

f0ofjuux2#

很简单。

  • 编辑:* 为了解释一下我的答案,TypeScript允许模块化使用类型。这允许开发人员定义typeinterface并将其导出。据我所知,没有“默认”导出类型的方法,因此始终使用带命名导入/导出的类型。我个人和专业地从我最初使用的文件中导出了typeinterface。通常情况下,类型 * 不 * 太通用,不值得放在单独的types.ts文件中,但有些人更喜欢以这种方式模块化。因此,如果一个类型(如Props)在多个文件中使用,您可以在您使用的任何文件中定义它(同时导出它以便在其他文件中使用),或者在src/types.ts文件中定义并导出类型,然后在任何地方重用它。在我看来,如果项目足够小,我会选择前者。

导出类型。

export type Props = {
  pageInfo: PageInfo;
  experiences: Experience[];
  skills: Skill[];
  projects: Project[];
  socials: Social[];
};

字符串
正确导出后,可以使用以下行导入到其他功能组件中:

import type { Page } from "PATH_TO_THE_FILE_THE_TYPE_IS_EXPORTED_FROM";

相关问题