Skip to content

Commit 40de7a0

Browse files
committed
fix: make SpecificResponseType correctly find fallbacks
1 parent ada8b4a commit 40de7a0

File tree

1 file changed

+20
-7
lines changed

1 file changed

+20
-7
lines changed

lib/types.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -125,16 +125,29 @@ export type ResponseType<R extends Route> = R["settings"]["response"];
125125
export type BodyType<R extends Route> = "body" extends keyof R["settings"]["response"]
126126
? R["settings"]["response"]["body"]
127127
: unknown;
128+
129+
type MoreThanOne<T, Td = T> = T extends unknown
130+
? [Td] extends [T]
131+
? never
132+
: T
133+
: never;
134+
135+
type FallbackStatus<T> = "status" extends keyof T
136+
? T extends { status: MoreThanOne<T["status"]> }
137+
? T
138+
: never
139+
: never;
140+
128141
/**
129142
* Get the response type for a route matching a specific status code
130143
*/
131-
export type SpecificResponseType<R extends Route, S extends StatusCode = StatusCode> = R["settings"]["response"] extends { status: S }
132-
? R["settings"]["response"]
133-
: "status" extends keyof R["settings"]["response"]
134-
? S extends R["settings"]["response"]["status"]
135-
? R["settings"]["response"]
136-
: RouteSettings["response"]
137-
: RouteSettings["response"];
144+
export type SpecificResponseType<
145+
R extends Route,
146+
S extends StatusCode = StatusCode,
147+
Ex = Extract<R["settings"]["response"], { status: S }>,
148+
> = Extract<R["settings"]["response"], { status: S }> extends never
149+
? FallbackStatus<R["settings"]["response"]>
150+
: Ex;
138151
/**
139152
* Get the response body type for a route matching a specific status code
140153
*/

0 commit comments

Comments
 (0)