Before
// page.tsx
/** meta data **/
export async function generateMetadata({ searchParams }: {
searchParams: Promise<{ [key: string]: string | undefined }>;
}): Promise<Metadata> {
const searchParam = (await searchParams) as
| string
| string[][]
| Record<string, string>
| URLSearchParams
| undefined;
const queryString = new URLSearchParams(searchParam).toString();
return getDefaultMetaData({
title: "mock",
openGraphUrl: `https://mock-url.com${queryString ? "?" + queryString : ""}`,
});
}
///
type mockProps = {
searchParams: Promise<{ [key: string]: string | undefined }>;
};
export default async function MockPage({ searchParams }: mockProps) {
const searchParam = await searchParams;
const serverId = !searchParam?.temporaryServerId
? Number(searchParam?.serverId || 1)
: Number(searchParam?.temporaryServerId || 1);
if (isNaN(serverId)) {
return await getUserInfo(searchParam);
}
const [queryData, serverData] = await Promise.all([
queryMock(
serverId,
searchParam?.keyword,
searchParam?.nickname,
{ lastId: undefined, pageSize: 70 },
header
),
queryMockServer(),
]);
return (
<Mock
mockData={queryData}
mockServerData={serverData}
serverId={serverId}
nickname={searchParam?.nickname}
keyword={searchParam?.keyword}
/>
);
}
After
// type.ts
export type SearchParams = Record<string, string | undefined>;
export type SearchParamsWithServerId = {
serverId?: string;
} & SearchParams;
export type PageProps<T extends SearchParams = SearchParams> = {
params: Promise<T>;
searchParams: Promise<T>;
};
/** generateMetadata 전용 제네릭 타입 **/
export type GenerateMetadata<T extends SearchParams> = (
props: PageProps<T>
) => Promise<Metadata>;
// page.tsx
/** meta data **/
export async function generateMetadata({ searchParams }: PageProps<mockProps>) {
const searchParam = await searchParams;
return getDefaultMetaData({
title: "mock",
openGraphUrl: `https://mock-url.com${searchParam}`,
});
}
///
type mockProps = {
keyword: string;
nickname: string;
} & SearchParamsWithServerId;
export default async function MockPage({ searchParams }: PageProps<mockProps>) {
const { serverId, keyword, nickname } = await searchParams;
const id = isNaN(Number(serverId)) ? 1 : Number(serverId);
const [queryData, serverData] = await Promise.all([
queryMock(
id,
keyword,
nickname,
{ lastId: undefined, pageSize: 70 },
header
),
queryMockServer(),
]);
return (
<Mock
mockData={queryData}
mockServerData={serverData}
serverId={id}
nickname={nickname}
keyword={keyword}
/>
);
}