Skip to content

Commit cf524db

Browse files
committed
allow more specific ReactNode types on createDeferredRsc
1 parent 90c1861 commit cf524db

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,
@@ -1260,61 +1260,63 @@ export function updateCacheNodeOnPopstateRestoration(
12601260

12611261
const DEFERRED = Symbol()
12621262

1263-
type PendingDeferredRsc = Promise<React.ReactNode> & {
1263+
type PendingDeferredRsc<T> = Promise<T> & {
12641264
status: 'pending'
1265-
resolve: (value: React.ReactNode) => void
1265+
resolve: (value: T) => void
12661266
reject: (error: any) => void
12671267
tag: Symbol
12681268
}
12691269

1270-
type FulfilledDeferredRsc = Promise<React.ReactNode> & {
1270+
type FulfilledDeferredRsc<T> = Promise<T> & {
12711271
status: 'fulfilled'
1272-
value: React.ReactNode
1273-
resolve: (value: React.ReactNode) => void
1272+
value: T
1273+
resolve: (value: T) => void
12741274
reject: (error: any) => void
12751275
tag: Symbol
12761276
}
12771277

1278-
type RejectedDeferredRsc = Promise<React.ReactNode> & {
1278+
type RejectedDeferredRsc<T> = Promise<T> & {
12791279
status: 'rejected'
12801280
reason: any
1281-
resolve: (value: React.ReactNode) => void
1281+
resolve: (value: T) => void
12821282
reject: (error: any) => void
12831283
tag: Symbol
12841284
}
12851285

1286-
type DeferredRsc =
1287-
| PendingDeferredRsc
1288-
| FulfilledDeferredRsc
1289-
| RejectedDeferredRsc
1286+
type DeferredRsc<T extends React.ReactNode = React.ReactNode> =
1287+
| PendingDeferredRsc<T>
1288+
| FulfilledDeferredRsc<T>
1289+
| RejectedDeferredRsc<T>
12901290

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

1299-
function createDeferredRsc(): PendingDeferredRsc {
1299+
function createDeferredRsc<
1300+
T extends React.ReactNode = React.ReactNode,
1301+
>(): PendingDeferredRsc<T> {
13001302
let resolve: any
13011303
let reject: any
1302-
const pendingRsc = new Promise<React.ReactNode>((res, rej) => {
1304+
const pendingRsc = new Promise<T>((res, rej) => {
13031305
resolve = res
13041306
reject = rej
1305-
}) as PendingDeferredRsc
1307+
}) as PendingDeferredRsc<T>
13061308
pendingRsc.status = 'pending'
1307-
pendingRsc.resolve = (value: React.ReactNode) => {
1309+
pendingRsc.resolve = (value: T) => {
13081310
if (pendingRsc.status === 'pending') {
1309-
const fulfilledRsc: FulfilledDeferredRsc = pendingRsc as any
1311+
const fulfilledRsc: FulfilledDeferredRsc<T> = pendingRsc as any
13101312
fulfilledRsc.status = 'fulfilled'
13111313
fulfilledRsc.value = value
13121314
resolve(value)
13131315
}
13141316
}
13151317
pendingRsc.reject = (error: any) => {
13161318
if (pendingRsc.status === 'pending') {
1317-
const rejectedRsc: RejectedDeferredRsc = pendingRsc as any
1319+
const rejectedRsc: RejectedDeferredRsc<T> = pendingRsc as any
13181320
rejectedRsc.status = 'rejected'
13191321
rejectedRsc.reason = error
13201322
reject(error)

0 commit comments

Comments
 (0)