Skip to content
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

Merged
merged 2 commits into from
Nov 4, 2023

Conversation

kettanaito
Copy link
Member

@kettanaito kettanaito commented Nov 1, 2023

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 the StrictResponse<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, so undefined is equivalent to a plain Response.

@@ -30,7 +30,7 @@ export interface RequestHandlerInternalInfo {
export type ResponseResolverReturnType<
BodyType extends DefaultBodyType = undefined,
> =
| (BodyType extends undefined ? Response : StrictResponse<BodyType>)
Copy link
Member Author

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))
Copy link
Member Author

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.

@kettanaito kettanaito force-pushed the fix/resolver-return-never branch from 00b3791 to 40f026f Compare November 1, 2023 18:34
@kettanaito kettanaito changed the title fix: correctly check "never" as response body type fix: correctly check "undefined" as response body type Nov 1, 2023
@@ -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>
Copy link
Member Author

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.

@kettanaito kettanaito merged commit a0ec8be into main Nov 4, 2023
9 checks passed
@kettanaito kettanaito deleted the fix/resolver-return-never branch November 4, 2023 15:21
@kettanaito
Copy link
Member Author

Released: v2.0.3 🎉

This has been released in v2.0.3!

Make sure to always update to the latest version (npm i msw@latest) to get the newest features and bug fixes.


Predictable release automation by @ossjs/release.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Typescript error: StrictResponse of generic is not assignable to AsyncResponseResolverReturnType
1 participant