Hur man skickar 'blocking' till getStaticPaths med TypeScript i Next.js?
Jag skulle använda fallback: 'blocking', för min Next.js-sida, men TypeScript vägrar det. Har den senaste 12.2.0 Next.js. Vad är fel?
Type '() => Promise<{ paths: any; fallback: string; }>' is not assignable to type 'GetStaticPaths<ParsedUrlQuery>'.
Type 'Promise<{ paths: any; fallback: string; }>' is not assignable to type 'GetStaticPathsResult<ParsedUrlQuery> | Promise<GetStaticPathsResult<ParsedUrlQuery>>'.
Type 'Promise<{ paths: any; fallback: string; }>' is not assignable to type 'Promise<GetStaticPathsResult<ParsedUrlQuery>>'.
Type '{ paths: any; fallback: string; }' is not assignable to type 'GetStaticPathsResult<ParsedUrlQuery>'.
Types of property 'fallback' are incompatible.
Type 'string' is not assignable to type 'boolean | "blocking"'.
och koden:
export const getStaticPaths: GetStaticPaths = async () => {
// ...
const paths = res.data.map((organizationAndPostId: string) => ({
params: {
organizationShortId: organizationAndPostId[0],
postId: organizationAndPostId[1],
tempUserShortId: organizationAndPostId[2],
imgId: organizationAndPostId[3],
},
}))
let ret = {
paths,
fallback: 'blocking',
}
return ret
}
Jag tror problemet är med " eller '. Men VSCode konverterar det automatiskt till '.
Svar #1
Du får typfelet eftersom när du deklarerar ret-objektet antar TypeScript att fallback är av typen string istället för att vara den literala strängen 'blocking'. Med andra ord blir ret-objektet internt typat på följande sätt, vilket är inkompatibelt med den förväntade GetStaticPaths-typen.
const obj: {
paths: {
params: { category: string; };
}[];
fallback: string; // `GetStaticPaths` expects this to be of type `boolean | 'blocking'`
}
För att åtgärda problemet kan du antingen returnera objektet direkt, utan den mellanstegande variabeln.
export const getStaticPaths: GetStaticPaths = async () => {
//...
return {
paths,
fallback: 'blocking'
}
}
Eller alternativt, omvandla fallback-värdet till en const för att tvinga det till literalsträngstyp.
export const getStaticPaths: GetStaticPaths = async () => {
//...
let ret = {
paths,
fallback: 'blocking' as const,
}
return ret
}
