Skip to content

Commit 685b025

Browse files
committed
allow more specific ReactNode types on createDeferredRsc
1 parent 8cfb577 commit 685b025

File tree

1 file changed

+21
-19
lines changed

1 file changed

+21
-19
lines changed

packages/next/src/client/components/router-reducer/ppr-navigations.ts

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -979,7 +979,7 @@ function createPendingCacheNode(
979979
: // We're navigating without a prefetch. We don't have a `loading` to display now,
980980
// but we might get one from the dynamic response. We'll fulfill this promise
981981
// when we receive that.
982-
(createDeferredRsc() as Promise<LoadingModuleData>)
982+
createDeferredRsc<LoadingModuleData>()
983983
return {
984984
lazyData: null,
985985
parallelRoutes: parallelRoutes,
@@ -1254,61 +1254,63 @@ export function updateCacheNodeOnPopstateRestoration(
12541254

12551255
const DEFERRED = Symbol()
12561256

1257-
type PendingDeferredRsc = Promise<React.ReactNode> & {
1257+
type PendingDeferredRsc<T> = Promise<T> & {
12581258
status: 'pending'
1259-
resolve: (value: React.ReactNode) => void
1259+
resolve: (value: T) => void
12601260
reject: (error: any) => void
12611261
tag: Symbol
12621262
}
12631263

1264-
type FulfilledDeferredRsc = Promise<React.ReactNode> & {
1264+
type FulfilledDeferredRsc<T> = Promise<T> & {
12651265
status: 'fulfilled'
1266-
value: React.ReactNode
1267-
resolve: (value: React.ReactNode) => void
1266+
value: T
1267+
resolve: (value: T) => void
12681268
reject: (error: any) => void
12691269
tag: Symbol
12701270
}
12711271

1272-
type RejectedDeferredRsc = Promise<React.ReactNode> & {
1272+
type RejectedDeferredRsc<T> = Promise<T> & {
12731273
status: 'rejected'
12741274
reason: any
1275-
resolve: (value: React.ReactNode) => void
1275+
resolve: (value: T) => void
12761276
reject: (error: any) => void
12771277
tag: Symbol
12781278
}
12791279

1280-
type DeferredRsc =
1281-
| PendingDeferredRsc
1282-
| FulfilledDeferredRsc
1283-
| RejectedDeferredRsc
1280+
type DeferredRsc<T extends React.ReactNode = React.ReactNode> =
1281+
| PendingDeferredRsc<T>
1282+
| FulfilledDeferredRsc<T>
1283+
| RejectedDeferredRsc<T>
12841284

12851285
// This type exists to distinguish a DeferredRsc from a Flight promise. It's a
12861286
// compromise to avoid adding an extra field on every Cache Node, which would be
12871287
// awkward because the pre-PPR parts of codebase would need to account for it,
12881288
// too. We can remove it once type Cache Node type is more settled.
12891289
function isDeferredRsc(value: any): value is DeferredRsc {
1290-
return value && value.tag === DEFERRED
1290+
return value && typeof value === 'object' && value.tag === DEFERRED
12911291
}
12921292

1293-
function createDeferredRsc(): PendingDeferredRsc {
1293+
function createDeferredRsc<
1294+
T extends React.ReactNode = React.ReactNode,
1295+
>(): PendingDeferredRsc<T> {
12941296
let resolve: any
12951297
let reject: any
1296-
const pendingRsc = new Promise<React.ReactNode>((res, rej) => {
1298+
const pendingRsc = new Promise<T>((res, rej) => {
12971299
resolve = res
12981300
reject = rej
1299-
}) as PendingDeferredRsc
1301+
}) as PendingDeferredRsc<T>
13001302
pendingRsc.status = 'pending'
1301-
pendingRsc.resolve = (value: React.ReactNode) => {
1303+
pendingRsc.resolve = (value: T) => {
13021304
if (pendingRsc.status === 'pending') {
1303-
const fulfilledRsc: FulfilledDeferredRsc = pendingRsc as any
1305+
const fulfilledRsc: FulfilledDeferredRsc<T> = pendingRsc as any
13041306
fulfilledRsc.status = 'fulfilled'
13051307
fulfilledRsc.value = value
13061308
resolve(value)
13071309
}
13081310
}
13091311
pendingRsc.reject = (error: any) => {
13101312
if (pendingRsc.status === 'pending') {
1311-
const rejectedRsc: RejectedDeferredRsc = pendingRsc as any
1313+
const rejectedRsc: RejectedDeferredRsc<T> = pendingRsc as any
13121314
rejectedRsc.status = 'rejected'
13131315
rejectedRsc.reason = error
13141316
reject(error)

0 commit comments

Comments
 (0)