我想在我的Next.js应用程序的某些页面上添加一个持久化布局。我发现this article解释了几种如何做到这一点的方法。这看起来很简单,但是我在使用推荐的方法时遇到了以下两个问题:
1.我正在使用TypeScript,不知道如何输入。例如,我有下面的代码,它可以工作,但我显然不喜欢使用as any
:
const getLayout =
(Component as any).getLayout ||
((page: NextPage) => <SiteLayout children={page} />);
1.我正在使用Apollo,因此我在某些页面上使用withApollo
HOC(来自here)。使用此选项会导致Component.getLayout
始终为undefined
。我没有足够好的理解正在发生的事情,知道为什么会发生这种情况(我可以猜到),所以很难自己解决这个问题。
5条答案
按热度按时间odopli941#
我有类似的问题,这是我如何解决我的项目。
创建
types/page.d.ts
类型定义:在
_app.tsx
文件中,上面只是一个最适合我的用例的示例实现,您可以切换
types/page.d.ts
中的类型以满足您的需求。vh0rcniy2#
可以通过向
AppProps.Component
添加getLayout
属性来扩展Next类型定义。next.d.ts
(从Next 11.1.0开始):pages/_app.tsx
:如果你想有更多的类型安全,你可以定义自定义的
NextPageWithLayout
类型,它将Assert你的组件有getLayout
属性集。next.d.ts
(从Next 11.1.0开始):pages/example-page/index.tsx
:请注意,在扩展Next类型定义时,必须提供精确的类型/接口签名(以及匹配的泛型),否则declaration merging将无法工作。不幸的是,这意味着如果库更改API,则需要调整类型定义。
zbsbpyhn3#
1.我相信next.js提供了一个
Component
prop作为AppProps的一部分。这个例子应该有你要找的东西。1.在创建使用
withApollo
Package 的组件后,您可能需要分配getLayout
:此外,next.js有两个例子可以用来实现这一点(虽然不是用typescript编写的):
p5fdfcr14#
假设您想在“Home”中使用
Layout
,wxclj1h55#
就这么做!不要惊慌,生活很简单。