Skip to content

Commit f4a9035

Browse files
Merge pull request #123 from ThomasAribart/fix-bug-with-compute-type-util
fix bug with Compute type util
2 parents 806a4ed + 1854f24 commit f4a9035

File tree

5 files changed

+38
-10
lines changed

5 files changed

+38
-10
lines changed

src/type-utils/compute.ts

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,33 @@
1-
export type Compute<A> = A extends Promise<infer T>
2-
? Promise<Compute<T>>
3-
: A extends (...args: infer P) => infer R
4-
? (...args: Compute<P>) => Compute<R>
5-
: A extends Set<infer V>
6-
? Set<Compute<V>>
7-
: A extends object
8-
? { [key in keyof A]: Compute<A[key]> }
9-
: A;
1+
import type { DoesExtend } from "./extends";
2+
import type { If } from "./if";
3+
import type { Key } from "./key";
4+
5+
export type Compute<A, Seen = never> = A extends
6+
| Function
7+
| Error
8+
| Date
9+
| { readonly [Symbol.toStringTag]: string }
10+
| RegExp
11+
| Generator
12+
? A
13+
: If<
14+
DoesExtend<Seen, A>,
15+
A,
16+
A extends Array<unknown>
17+
? A extends Array<Record<Key, unknown>>
18+
? Array<
19+
{
20+
[K in keyof A[number]]: Compute<A[number][K], A | Seen>;
21+
} & unknown
22+
>
23+
: A
24+
: A extends ReadonlyArray<unknown>
25+
? A extends ReadonlyArray<Record<string | number | symbol, unknown>>
26+
? ReadonlyArray<
27+
{
28+
[K in keyof A[number]]: Compute<A[number][K], A | Seen>;
29+
} & unknown
30+
>
31+
: A
32+
: { [K in keyof A]: Compute<A[K], A | Seen> } & unknown
33+
>;

src/type-utils/extends.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
* @param B Type
66
* @return Boolean
77
*/
8-
export type DoesExtend<A, B> = A extends B ? true : false;
8+
export type DoesExtend<A, B> = [A] extends [B] ? true : false;

src/type-utils/if.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export type If<B extends boolean, T, E = never> = B extends true ? T : E;

src/type-utils/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ export type { And } from "./and";
22
export type { Compute } from "./compute";
33
export type { DoesExtend } from "./extends";
44
export type { DeepGet } from "./get";
5+
export type { If } from "./if";
6+
export type { Key } from "./key";
57
export type { Join } from "./join";
68
export type { Narrow } from "./narrow";
79
export type { Pop } from "./pop";

src/type-utils/key.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export type Key = string | number | symbol;

0 commit comments

Comments
 (0)