質問
Next.js + TypeScriptの勉強のため以下のリポジトリの改造を試みていますが、
序盤で詰まってしまいました。
https://github.com/Daniel-Kao/nextjs-demo
発生している問題・エラーメッセージ
web/pages/dashboards.ts
import React from "react" import { AuthProps, privateRoute } from "../components/private_route"; import Cookie from "js-cookie"; import Router from "next/router"; import { COOKIES } from "../services/login_service"; import { Links } from "../components/links"; import { get } from "../services/rest_service"; import { AuthToken } from "../services/auth_token"; type Props = AuthProps & { message: string } function Page(props: Props) { const logout = async () => { Cookie.remove(COOKIES.authToken); alert("logout"); await Router.push("/login"); }; console.log(props.auth); return <> <Links /> <p>{props.message}</p> {/*<div>{props.auth.authorizationString}</div>*/} <p>isAuthenticated:{props.auth.isAuthenticated ? "YES" : "NO"}</p> <button onClick={logout}>Logout</button> </> } Page.getInitialProps = async ({ auth }: AuthProps): Promise<Props> => { const res: any = await get("/api/restricted", { headers: { Authorization: auth.authorizationString } }); let message = "Something unexpected happened!"; if (res.error) { message = res.error; } else if (res.data && res.data.message) { message = res.data.message } return { message, auth, }; }; export default privateRoute(Page);
を
・functionをconstに変更
・型安全のため「NextPage」を使用(ここは知識が曖昧)
するため下記のように書き換えました。
import React from "react" import { AuthProps, privateRoute } from "../components/private_route"; import Cookie from "js-cookie"; import Router from "next/router"; import { COOKIES } from "../services/login_service"; import { Links } from "../components/links"; import { get } from "../services/rest_service"; import { AuthToken } from "../services/auth_token"; import { NextPage } from "next"; type Props = AuthProps & { message: string } const Page : NextPage<Props> = (props : Props) => { const logout = async () => { Cookie.remove(COOKIES.authToken); alert("logout"); await Router.push("/login"); }; console.log(props.auth); return <> <Links /> <p>{props.message}</p> {/*<div>{props.auth.authorizationString}</div>*/} <p>isAuthenticated:{props.auth.isAuthenticated ? "YES" : "NO"}</p> <button onClick={logout}>Logout</button> </> } Page.getInitialProps = async ({ auth }: AuthProps): Promise<Props> => { const res: any = await get("/api/restricted", { headers: { Authorization: auth.authorizationString } }); let message = "Something unexpected happened!"; if (res.error) { message = res.error; } else if (res.data && res.data.message) { message = res.data.message } return { message, auth, }; }; export default privateRoute(Page);
しかし、書き換えたところ、
「const Page」の部分で
型 '{ (props: Props): JSX.Element; getInitialProps({ auth }: AuthProps): Promise<Props>; }' を型 'NextComponentType<NextPageContext, {}, {}>' に割り当てることはできません。 型 '{ (props: Props): JSX.Element; getInitialProps({ auth }: AuthProps): Promise<Props>; }' を型 'FunctionComponent<{}> & { getInitialProps?(context: NextPageContext): {} | Promise<{}>; }' に割り当てることはできません。 型 '{ (props: Props): JSX.Element; getInitialProps({ auth }: AuthProps): Promise<Props>; }' を型 'FunctionComponent<{}>' に割り当てることはできません。 パラメーター 'props' および 'props' は型に互換性がありません。 型 '{ children?: ReactNode; }' を型 'Props' に割り当てることはできません。 プロパティ 'auth' は型 '{ children?: ReactNode; }' にありませんが、型 'AuthProps' では必須です。ts(2322)
「Page.getInitialProps」の部分で、
型 '({ auth }: AuthProps) => Promise<Props>' を型 '(context: NextPageContext) => {} | Promise<{}>' に割り当てることはできません。 パラメーター '__0' および 'context' は型に互換性がありません。 プロパティ 'auth' は型 'NextPageContext' にありませんが、型 'AuthProps' では必須です。
とのシンタックスエラーが出てきてしまいました。
質問
知りたい点は以下です。
(1)NextPageは型安全を保証するための機能という認識で間違いないでしょうか?
(2)上記のコードは何故シンタックスエラーになるのでしょうか。どのように修正すれば良いでしょうか。
初心者の為見当外れな事をしているかもしれません。至らない点があれば申し訳ございません。
試したこと
検索しながら、コードを変更したり削ったり試行錯誤して数時間格闘しましたが、
分かりませんでした。。。
補足情報(FW/ツールのバージョンなど)
Next.js 9.5
TypeScript 3.5
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/05 12:50 編集
2020/09/05 22:41
2020/09/06 10:37 編集
2020/09/06 10:55
2020/09/06 11:31
2020/09/06 11:43