Skip to content

Commit bed43d0

Browse files
committed
fix: dpattern add tu union tuple
1 parent be5309d commit bed43d0

File tree

11 files changed

+395
-62
lines changed

11 files changed

+395
-62
lines changed

scripts/common/forward.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export function forward<
2+
GenericValue extends unknown,
3+
>(value: GenericValue) {
4+
return value;
5+
}

scripts/common/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,4 @@ export * from "./toString";
2626
export * from "./innerPipe";
2727
export * from "./asyncInnerPipe";
2828
export * from "./loop";
29+
export * from "./forward";

scripts/common/types/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,5 @@ export * from "./and";
3232
export * from "./or";
3333
export * from "./breakGenericLink";
3434
export * from "./not";
35+
export * from "./lastUnionElement";
3536

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { type UnionToIntersection } from "./unionToIntersection";
2+
3+
export type LastUnionElement<T> =
4+
UnionToIntersection<
5+
T extends any
6+
? () => T
7+
: never
8+
> extends () => (infer R)
9+
? R
10+
: never;

scripts/common/types/unionToTuple.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
1-
import { type UnionToIntersection } from "./unionToIntersection";
2-
3-
type GetLastOfUnion<T> =
4-
UnionToIntersection<
5-
T extends any
6-
? () => T
7-
: never
8-
> extends () => (infer R)
9-
? R
10-
: never;
1+
import { type LastUnionElement } from "./lastUnionElement";
112

123
type PushElementToTuple<T extends any[], V> = [...T, V];
134

145
export type UnionToTuple<
156
T,
16-
L = GetLastOfUnion<T>,
7+
L = LastUnionElement<T>,
178
N = [T] extends [never]
189
? true
1910
: false,

scripts/pattern/types/complexUnMatchedValue/array.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,17 @@ type ComplexUnMatchedTupleTuple<
5252
InferredInputRest,
5353
InferredPatternValueRest
5454
> extends infer InferredResultRest
55-
? IsEqual<InferredResultRest, never> extends true
56-
? never
57-
: [
58-
IsEqual<InferredResultFirst, never> extends true
59-
? InferredInputFirst
60-
: InferredResultFirst,
61-
...Adaptor<
62-
InferredResultRest,
63-
readonly any[]
64-
>,
65-
]
55+
? [
56+
IsEqual<InferredResultFirst, never> extends true
57+
? InferredInputFirst
58+
: InferredResultFirst,
59+
...Adaptor<
60+
IsEqual<InferredResultRest, never> extends true
61+
? InferredPatternValueRest
62+
: InferredResultRest,
63+
readonly any[]
64+
>,
65+
]
6666
: never
6767
: never
6868
: never
Lines changed: 64 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
import { type AnyTuple, type Adaptor, type IsEqual } from "@scripts/common";
1+
import { type AnyTuple, type Adaptor, type IsEqual, type Or } from "@scripts/common";
22
import { type EligiblePrimitiveMatch } from "../pattern";
33
import { type FlatObject } from "@scripts/object/types/flatObject";
4-
import { type GetPropsWithValue } from "@scripts/object";
4+
5+
type tt = GetIncompleteUnion<
6+
["one", 5, 7n] | ["two", 5n] | ["three", ...string[]],
7+
["one", 5, 7n] | ["two", 5n]
8+
>;
59

610
export type GetIncompleteUnion<
711
GenericInput extends unknown,
@@ -34,17 +38,13 @@ export type GetIncompleteUnion<
3438
InferredInput,
3539
Exclude<Extract<GenericInput, object>, readonly any[]>
3640
> extends true
37-
? {
41+
? FlatObject<{
3842
[Prop in (InferredPatternValue extends any ? keyof InferredPatternValue : never)]:
3943
GetIncompleteUnion<
4044
InferredInput[Adaptor<Prop, keyof InferredInput>],
4145
InferredPatternValue[Prop]
4246
>
43-
} extends infer InferredResult extends object
44-
? FlatObject<
45-
Omit<InferredResult, GetPropsWithValue<InferredResult, never>>
46-
>
47-
: never
47+
}>
4848
: IsEqual<InferredInput, never> extends true
4949
? {}
5050
: {
@@ -54,47 +54,80 @@ export type GetIncompleteUnion<
5454
)
5555
| (
5656
[
57-
Extract<GenericInput, AnyTuple>,
57+
Exclude<Extract<GenericInput, AnyTuple>, GenericPatternValue>,
5858
Extract<GenericPatternValue, AnyTuple>,
5959
] extends [
6060
infer InferredInput,
6161
infer InferredPatternValue,
6262
]
6363
? IsEqual<InferredPatternValue, never> extends true
6464
? never
65-
: [
65+
: IsEqual<
6666
InferredInput,
67-
InferredPatternValue,
68-
] extends [
69-
readonly [infer InferredInputFirst, ...infer InferredInputRest],
70-
readonly [infer InferredPatternValueFirst, ...infer InferredPatternValueRest],
71-
]
72-
? GetIncompleteUnion<
73-
InferredInputFirst,
74-
InferredPatternValueFirst
75-
> extends infer InferredResultFirst
76-
? FlatObject<{
77-
"[first": InferredResultFirst;
78-
"rest]": GetIncompleteUnion<
79-
InferredInputRest,
80-
InferredPatternValueRest
81-
>;
82-
}>
67+
Extract<GenericInput, AnyTuple>
68+
> extends true
69+
? [
70+
InferredInput,
71+
InferredPatternValue,
72+
] extends [
73+
readonly [infer InferredInputFirst, ...infer InferredInputRest],
74+
readonly [infer InferredPatternValueFirst, ...infer InferredPatternValueRest],
75+
]
76+
? GetIncompleteUnion<
77+
InferredInputFirst,
78+
InferredPatternValueFirst
79+
> extends infer InferredResultFirst
80+
? FlatObject<{
81+
"[tuple.first": InferredResultFirst;
82+
"tuple.rest]": GetIncompleteUnion<
83+
InferredInputRest,
84+
InferredPatternValueRest
85+
>;
86+
}>
87+
: never
8388
: never
84-
: never
89+
: IsEqual<InferredInput, never> extends true
90+
? {}
91+
: {
92+
"[tuple]": true;
93+
}
8594
: never
8695
)
8796
| (
8897
[
8998
Exclude<Extract<GenericInput, readonly any[]>, AnyTuple>,
9099
Extract<GenericPatternValue, AnyTuple>,
91100
] extends [
92-
infer _inferredInput,
93-
infer inferredPatternValue,
101+
infer InferredInput extends readonly any[],
102+
infer InferredPatternValue,
94103
]
95-
? IsEqual<inferredPatternValue, never> extends true
104+
? Or<[
105+
IsEqual<InferredPatternValue, never>,
106+
IsEqual<InferredInput, never>,
107+
]> extends true
96108
? never
97-
: never
109+
: InferredPatternValue extends readonly [
110+
infer InferredPatternValueFirst,
111+
...infer InferredPatternValueRest,
112+
]
113+
? GetIncompleteUnion<
114+
InferredInput[number],
115+
InferredPatternValueFirst
116+
> extends infer InferredResultFirst
117+
? FlatObject<{
118+
"[array.first": InferredResultFirst;
119+
"array.rest]": Or<[
120+
IsEqual<InferredResultFirst, never>,
121+
IsEqual<InferredResultFirst, {}>,
122+
]> extends true
123+
? GetIncompleteUnion<
124+
InferredInput,
125+
InferredPatternValueRest
126+
>
127+
: never;
128+
}>
129+
: never
130+
: never
98131
: never
99132
)
100133
);
Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { type IsUnion } from "@scripts/common";
1+
import { type IsUnion, type LastUnionElement } from "@scripts/common";
22
import { type ComputeComplexUnMatchedValue } from ".";
33

44
export type ComplexUnMatchedUnionObject<
@@ -7,14 +7,16 @@ export type ComplexUnMatchedUnionObject<
77
> = (
88
IsUnion<Extract<GenericPatternValue, object>> extends false
99
? never
10-
: Extract<GenericPatternValue, any> extends infer inferredPatternValue
11-
? inferredPatternValue extends object
12-
? ComputeComplexUnMatchedValue<GenericInput, inferredPatternValue> extends infer InferredResult
13-
? ComputeComplexUnMatchedValue<
14-
InferredResult,
15-
Exclude<GenericPatternValue, inferredPatternValue>
16-
>
10+
: Extract<GenericPatternValue, any> extends infer InferredPatternValue
11+
? LastUnionElement<
12+
InferredPatternValue extends object
13+
? ComputeComplexUnMatchedValue<GenericInput, InferredPatternValue> extends infer InferredResult
14+
? ComputeComplexUnMatchedValue<
15+
InferredResult,
16+
Exclude<GenericPatternValue, InferredPatternValue>
17+
>
18+
: never
1719
: never
18-
: never
20+
>
1921
: never
2022
);

tests/common/forward.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { type ExpectType, forward } from "@scripts";
2+
3+
it("forward", () => {
4+
const result = forward(1);
5+
6+
expect(result).toBe(1);
7+
8+
type Check = ExpectType<
9+
typeof result,
10+
1,
11+
"strict"
12+
>;
13+
});

0 commit comments

Comments
 (0)