Skip to content

Commit

Permalink
Merge pull request #123 from ThomasAribart/fix-bug-with-compute-type-…
Browse files Browse the repository at this point in the history
…util

fix bug with Compute type util
  • Loading branch information
ThomasAribart authored Feb 22, 2023
2 parents 806a4ed + 1854f24 commit f4a9035
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 10 deletions.
42 changes: 33 additions & 9 deletions src/type-utils/compute.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,33 @@
export type Compute<A> = A extends Promise<infer T>
? Promise<Compute<T>>
: A extends (...args: infer P) => infer R
? (...args: Compute<P>) => Compute<R>
: A extends Set<infer V>
? Set<Compute<V>>
: A extends object
? { [key in keyof A]: Compute<A[key]> }
: A;
import type { DoesExtend } from "./extends";
import type { If } from "./if";
import type { Key } from "./key";

export type Compute<A, Seen = never> = A extends
| Function
| Error
| Date
| { readonly [Symbol.toStringTag]: string }
| RegExp
| Generator
? A
: If<
DoesExtend<Seen, A>,
A,
A extends Array<unknown>
? A extends Array<Record<Key, unknown>>
? Array<
{
[K in keyof A[number]]: Compute<A[number][K], A | Seen>;
} & unknown
>
: A
: A extends ReadonlyArray<unknown>
? A extends ReadonlyArray<Record<string | number | symbol, unknown>>
? ReadonlyArray<
{
[K in keyof A[number]]: Compute<A[number][K], A | Seen>;
} & unknown
>
: A
: { [K in keyof A]: Compute<A[K], A | Seen> } & unknown
>;
2 changes: 1 addition & 1 deletion src/type-utils/extends.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
* @param B Type
* @return Boolean
*/
export type DoesExtend<A, B> = A extends B ? true : false;
export type DoesExtend<A, B> = [A] extends [B] ? true : false;
1 change: 1 addition & 0 deletions src/type-utils/if.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export type If<B extends boolean, T, E = never> = B extends true ? T : E;
2 changes: 2 additions & 0 deletions src/type-utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ export type { And } from "./and";
export type { Compute } from "./compute";
export type { DoesExtend } from "./extends";
export type { DeepGet } from "./get";
export type { If } from "./if";
export type { Key } from "./key";
export type { Join } from "./join";
export type { Narrow } from "./narrow";
export type { Pop } from "./pop";
Expand Down
1 change: 1 addition & 0 deletions src/type-utils/key.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export type Key = string | number | symbol;

0 comments on commit f4a9035

Please sign in to comment.