Как набрать функцию getStaticProps при использовании параметров getStaticPaths?
Я работаю над следующим фрагментом кода:
Это динамическая страница blogPost:
/post/[slug].tsx
export const getStaticPaths: GetStaticPaths = async () => {
const allSlugs = await getAllSlugs();;
return ({
paths: allSlugs.map((slug) => ({ params: { slug }})),
fallback: "blocking"
});
};
export const getStaticProps: GetStaticProps = async (context) => {
const slug = context.params.slug;
const blogPost = getBlogPostFromSlug({slug});
return ({
props: {
blogPost
}
});
};
Я получаю вот такую ошибку:
Кажется, что тип универсален и может быть настроен для моих типов.
Я создал эти два типа, чтобы попытаться настроить
GetStaticProps
тип:
type ContextParams = {
slug: string
}
type PageProps = {
blogPost: null | Types.BlogPost.Item
}
Вот что я пытаюсь:
export const getStaticProps: GetStaticProps<PageProps,ContextParams> = async (context) => {
const slug = context.params.slug;
const blogPost = await getBlogPostFromSlug({slug});
return ({
props: {
blogPost
}
});
};
Но он все еще думает, что это может быть неопределенным. Должен ли я просто разобраться с этим? Из приведенного выше кода кажется, что
params
может быть неопределенным? Я этого не ожидал.
1 ответ
Типы определены таким образом, что переменная все еще должна быть
undefined
даже когда вы объявляете тип для параметров
Q
. Из файла типов :
export type GetStaticPropsContext<Q extends ParsedUrlQuery = ParsedUrlQuery> = {
params?: Q
...
Поэтому, если вы хотите быть в безопасности, вы должны предположить, что у вас могло и не быть. Я бы использовал
notFound
или же
redirect
свойства, описанные здесь, для обработки запросов с отсутствующими
params
. Вы также хотите обрабатывать случаи, когда ваш
async
функция
getBlogPostFromSlug
Было отказано.
export const getStaticProps: GetStaticProps<PageProps, ContextParams> = async (
context
) => {
const slug = context.params?.slug;
if (slug) {
try {
const blogPost = await getBlogPostFromSlug({ slug });
return {
props: {
blogPost
}
};
} catch (error) { }
}
return {
notFound: true
};
};