-
-
Notifications
You must be signed in to change notification settings - Fork 534
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: correctly check "undefined" as response body type #1824
Conversation
@@ -30,7 +30,7 @@ export interface RequestHandlerInternalInfo { | |||
export type ResponseResolverReturnType< | |||
BodyType extends DefaultBodyType = undefined, | |||
> = | |||
| (BodyType extends undefined ? Response : StrictResponse<BodyType>) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
T extends undefined
is not the correct way to check if a generic was provided in TypeScript. Instead, one must resort to a hack:
[T] extends [never] ? 'NOT PROVIDED' : 'PROVIDED'
The previous implementation was giving false positives, making the custom response body type and the body type in ResponseResolverReturnType
incompatible.
|
||
function myHandler<CustomResponseBodyType extends DefaultBodyType>(path: Path) { | ||
return (response: CustomResponseBodyType) => { | ||
http.get(path, () => HttpResponse.json(response)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also adding a typing regression test to make sure this doesn't happen again.
00b3791
to
40f026f
Compare
@@ -265,7 +265,7 @@ export abstract class RequestHandler< | |||
|
|||
// Clone the previously stored response from the generator | |||
// so that it could be read again. | |||
return this.resolverGeneratorResult.clone() | |||
return this.resolverGeneratorResult.clone() as StrictResponse<any> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A bit hacky. Suggestions are welcome.
Released: v2.0.3 🎉This has been released in v2.0.3! Make sure to always update to the latest version ( Predictable release automation by @ossjs/release. |
Why still check if
[undefined
] and not[never]
?Because
never
is an explicit "this response must not have any body". This is a narrower response body type and it must use theStrictResponse<never>
internal type if it's provided.undefined
is the default (fallback) response body type. This means that by default, we don't know what type the response body will be, soundefined
is equivalent to a plainResponse
.