Skip to content

Commit

Permalink
fix: distribute over union types with promises
Browse files Browse the repository at this point in the history
  • Loading branch information
pcattori committed Aug 8, 2023
1 parent 267d6bc commit 0ffe817
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 3 deletions.
4 changes: 2 additions & 2 deletions packages/remix-server-runtime/__tests__/serialize-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ it("infers basic types", () => {
});

it("infers deferred types", () => {
let get = (): Promise<string> | undefined => {
if (Math.random() > 0.5) return Promise.resolve("hello");
let get = (): Promise<Date> | undefined => {
if (Math.random() > 0.5) return Promise.resolve(new Date());
return undefined;
};
let loader = async () =>
Expand Down
9 changes: 8 additions & 1 deletion packages/remix-server-runtime/serialize.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,18 @@ export type SerializeFrom<T extends AppData | Fn> =
Promise<any> extends U[K] ? K :
never
]:
U[K] extends Promise<any> ? Promise<Jsonify<Awaited<U[K]>>> : Jsonify<U[K]>
// use generic to distribute over union
DeferValue<U[K]>
}
// non-promises
& Jsonify<{ [K in keyof U as Promise<any> extends U[K] ? never : K]: U[K] }>
:
Jsonify<Awaited<Output>> :
Jsonify<Awaited<T>>
;

// prettier-ignore
type DeferValue<T> =
T extends undefined ? undefined :
T extends Promise<unknown> ? Promise<Jsonify<Awaited<T>>> :
Jsonify<T>;

0 comments on commit 0ffe817

Please sign in to comment.