Skip to content

Commit 31d1d63

Browse files
authored
Infer fixed-size tuples from infer type parameters with extends clauses at variadic positions (#51157)
* Infer fixed-size tuples from infer type parameters with extends clauses at variadic positions * Improve the fix to handle tuples with leading variadic elements * Fixed indentation * Infer rest element following a variadic element with a fixed-size constraint * Infer rest element preceding a variadic element with a fixed-size constraint * Rewrite the test to avoid accidental union reductions
1 parent 1a943d7 commit 31d1d63

4 files changed

+370
-7
lines changed

src/compiler/checker.ts

+36-7
Original file line numberDiff line numberDiff line change
@@ -24303,13 +24303,42 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2430324303
}
2430424304
else {
2430524305
const middleLength = targetArity - startLength - endLength;
24306-
if (middleLength === 2 && elementFlags[startLength] & elementFlags[startLength + 1] & ElementFlags.Variadic && isTupleType(source)) {
24307-
// Middle of target is [...T, ...U] and source is tuple type
24308-
const targetInfo = getInferenceInfoForType(elementTypes[startLength]);
24309-
if (targetInfo && targetInfo.impliedArity !== undefined) {
24310-
// Infer slices from source based on implied arity of T.
24311-
inferFromTypes(sliceTupleType(source, startLength, endLength + sourceArity - targetInfo.impliedArity), elementTypes[startLength]);
24312-
inferFromTypes(sliceTupleType(source, startLength + targetInfo.impliedArity, endLength), elementTypes[startLength + 1]);
24306+
if (middleLength === 2) {
24307+
if (elementFlags[startLength] & elementFlags[startLength + 1] & ElementFlags.Variadic && isTupleType(source)) {
24308+
// Middle of target is [...T, ...U] and source is tuple type
24309+
const targetInfo = getInferenceInfoForType(elementTypes[startLength]);
24310+
if (targetInfo && targetInfo.impliedArity !== undefined) {
24311+
// Infer slices from source based on implied arity of T.
24312+
inferFromTypes(sliceTupleType(source, startLength, endLength + sourceArity - targetInfo.impliedArity), elementTypes[startLength]);
24313+
inferFromTypes(sliceTupleType(source, startLength + targetInfo.impliedArity, endLength), elementTypes[startLength + 1]);
24314+
}
24315+
}
24316+
else if (elementFlags[startLength] & ElementFlags.Variadic && elementFlags[startLength + 1] & ElementFlags.Rest) {
24317+
// Middle of target is [...T, ...rest] and source is tuple type
24318+
// if T is constrained by a fixed-size tuple we might be able to use its arity to infer T
24319+
const param = getInferenceInfoForType(elementTypes[startLength])?.typeParameter;
24320+
const constraint = param && getBaseConstraintOfType(param);
24321+
if (constraint && isTupleType(constraint) && !constraint.target.hasRestElement) {
24322+
const impliedArity = constraint.target.fixedLength;
24323+
inferFromTypes(sliceTupleType(source, startLength, sourceArity - (startLength + impliedArity)), elementTypes[startLength]);
24324+
inferFromTypes(getElementTypeOfSliceOfTupleType(source, startLength + impliedArity, endLength)!, elementTypes[startLength + 1]);
24325+
}
24326+
}
24327+
else if (elementFlags[startLength] & ElementFlags.Rest && elementFlags[startLength + 1] & ElementFlags.Variadic && isTupleType(source)) {
24328+
// Middle of target is [...rest, ...T] and source is tuple type
24329+
// if T is constrained by a fixed-size tuple we might be able to use its arity to infer T
24330+
const param = getInferenceInfoForType(elementTypes[startLength + 1])?.typeParameter;
24331+
const constraint = param && getBaseConstraintOfType(param);
24332+
if (constraint && isTupleType(constraint) && !constraint.target.hasRestElement) {
24333+
const impliedArity = constraint.target.fixedLength;
24334+
const endIndex = sourceArity - getEndElementCount(target.target, ElementFlags.Fixed);
24335+
const startIndex = endIndex - impliedArity;
24336+
const trailingSlice = createTupleType(getTypeArguments(source).slice(startIndex, endIndex), source.target.elementFlags.slice(startIndex, endIndex),
24337+
/*readonly*/ false, source.target.labeledElementDeclarations && source.target.labeledElementDeclarations.slice(startIndex, endIndex));
24338+
24339+
inferFromTypes(getElementTypeOfSliceOfTupleType(source, startLength, endLength + impliedArity)!, elementTypes[startLength]);
24340+
inferFromTypes(trailingSlice, elementTypes[startLength + 1]);
24341+
}
2431324342
}
2431424343
}
2431524344
else if (middleLength === 1 && elementFlags[startLength] & ElementFlags.Variadic) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
=== tests/cases/compiler/inferTypesWithFixedTupleExtendsAtVariadicPosition.ts ===
2+
// repro #51138
3+
4+
type SubTup2FixedLength<T extends unknown[]> = T extends [
5+
>SubTup2FixedLength : Symbol(SubTup2FixedLength, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 0, 0))
6+
>T : Symbol(T, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 2, 24))
7+
>T : Symbol(T, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 2, 24))
8+
9+
...infer B extends [any, any],
10+
>B : Symbol(B, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 3, 10))
11+
12+
any
13+
]
14+
? B
15+
>B : Symbol(B, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 3, 10))
16+
17+
: never;
18+
19+
type SubTup2FixedLengthTest = SubTup2FixedLength<[a: 0, b: 1, c: 2]>;
20+
>SubTup2FixedLengthTest : Symbol(SubTup2FixedLengthTest, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 7, 10))
21+
>SubTup2FixedLength : Symbol(SubTup2FixedLength, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 0, 0))
22+
23+
type SubTup2Variadic<T extends unknown[]> = T extends [
24+
>SubTup2Variadic : Symbol(SubTup2Variadic, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 9, 69))
25+
>T : Symbol(T, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 11, 21))
26+
>T : Symbol(T, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 11, 21))
27+
28+
...infer B extends [any, any],
29+
>B : Symbol(B, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 12, 10))
30+
31+
...any
32+
]
33+
? B
34+
>B : Symbol(B, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 12, 10))
35+
36+
: never;
37+
38+
type SubTup2VariadicTest = SubTup2Variadic<[a: 0, b: 1, ...c: 2[]]>;
39+
>SubTup2VariadicTest : Symbol(SubTup2VariadicTest, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 16, 10))
40+
>SubTup2Variadic : Symbol(SubTup2Variadic, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 9, 69))
41+
42+
type SubTup2VariadicTest2 = SubTup2Variadic<[a: 0, b: 1, c: 2, ...d: 3[]]>;
43+
>SubTup2VariadicTest2 : Symbol(SubTup2VariadicTest2, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 18, 68))
44+
>SubTup2Variadic : Symbol(SubTup2Variadic, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 9, 69))
45+
46+
type SubTup2VariadicAndRest<T extends unknown[]> = T extends [
47+
>SubTup2VariadicAndRest : Symbol(SubTup2VariadicAndRest, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 19, 75))
48+
>T : Symbol(T, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 21, 28))
49+
>T : Symbol(T, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 21, 28))
50+
51+
...infer B extends [any, any],
52+
>B : Symbol(B, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 22, 12))
53+
54+
...(infer C)[]
55+
>C : Symbol(C, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 23, 13))
56+
57+
]
58+
? [...B, ...[C]]
59+
>B : Symbol(B, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 22, 12))
60+
>C : Symbol(C, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 23, 13))
61+
62+
: never;
63+
64+
type SubTup2VariadicAndRestTest = SubTup2VariadicAndRest<[a: 0, b: 1, ...c: 2[]]>;
65+
>SubTup2VariadicAndRestTest : Symbol(SubTup2VariadicAndRestTest, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 26, 12))
66+
>SubTup2VariadicAndRest : Symbol(SubTup2VariadicAndRest, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 19, 75))
67+
68+
type SubTup2TrailingVariadic<T extends unknown[]> = T extends [
69+
>SubTup2TrailingVariadic : Symbol(SubTup2TrailingVariadic, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 28, 82))
70+
>T : Symbol(T, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 30, 29))
71+
>T : Symbol(T, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 30, 29))
72+
73+
...any,
74+
...infer B extends [any, any],
75+
>B : Symbol(B, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 32, 10))
76+
77+
]
78+
? B
79+
>B : Symbol(B, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 32, 10))
80+
81+
: never;
82+
83+
type SubTup2TrailingVariadicTest = SubTup2TrailingVariadic<[...a: 0[], b: 1, c: 2]>;
84+
>SubTup2TrailingVariadicTest : Symbol(SubTup2TrailingVariadicTest, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 35, 10))
85+
>SubTup2TrailingVariadic : Symbol(SubTup2TrailingVariadic, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 28, 82))
86+
87+
type SubTup2TrailingVariadicTest2 = SubTup2TrailingVariadic<[...a: 0[], b: 1, c: 2, d: 3]>;
88+
>SubTup2TrailingVariadicTest2 : Symbol(SubTup2TrailingVariadicTest2, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 37, 84))
89+
>SubTup2TrailingVariadic : Symbol(SubTup2TrailingVariadic, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 28, 82))
90+
91+
type SubTup2RestAndTrailingVariadic2<T extends unknown[]> = T extends [
92+
>SubTup2RestAndTrailingVariadic2 : Symbol(SubTup2RestAndTrailingVariadic2, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 38, 91))
93+
>T : Symbol(T, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 40, 37))
94+
>T : Symbol(T, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 40, 37))
95+
96+
...(infer C)[],
97+
>C : Symbol(C, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 41, 13))
98+
99+
...infer B extends [any, any],
100+
>B : Symbol(B, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 42, 12))
101+
102+
]
103+
? [C, ...B]
104+
>C : Symbol(C, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 41, 13))
105+
>B : Symbol(B, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 42, 12))
106+
107+
: never;
108+
109+
type SubTup2RestAndTrailingVariadic2Test = SubTup2RestAndTrailingVariadic2<[...a: 0[], b: 1, c: 2]>;
110+
>SubTup2RestAndTrailingVariadic2Test : Symbol(SubTup2RestAndTrailingVariadic2Test, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 45, 12))
111+
>SubTup2RestAndTrailingVariadic2 : Symbol(SubTup2RestAndTrailingVariadic2, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 38, 91))
112+
113+
type SubTup2VariadicWithLeadingFixedElements<T extends unknown[]> = T extends [
114+
>SubTup2VariadicWithLeadingFixedElements : Symbol(SubTup2VariadicWithLeadingFixedElements, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 47, 100))
115+
>T : Symbol(T, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 49, 45))
116+
>T : Symbol(T, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 49, 45))
117+
118+
any,
119+
...infer B extends [any, any],
120+
>B : Symbol(B, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 51, 10))
121+
122+
...any
123+
]
124+
? B
125+
>B : Symbol(B, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 51, 10))
126+
127+
: never;
128+
129+
type SubTup2VariadicWithLeadingFixedElementsTest = SubTup2VariadicWithLeadingFixedElements<[a: 0, b: 1, c: 2, ...d: 3[]]>;
130+
>SubTup2VariadicWithLeadingFixedElementsTest : Symbol(SubTup2VariadicWithLeadingFixedElementsTest, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 55, 10))
131+
>SubTup2VariadicWithLeadingFixedElements : Symbol(SubTup2VariadicWithLeadingFixedElements, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 47, 100))
132+
133+
type SubTup2VariadicWithLeadingFixedElementsTest2 = SubTup2VariadicWithLeadingFixedElements<[a: 0, b: 1, c: 2, d: 3, ...e: 4[]]>;
134+
>SubTup2VariadicWithLeadingFixedElementsTest2 : Symbol(SubTup2VariadicWithLeadingFixedElementsTest2, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 57, 122))
135+
>SubTup2VariadicWithLeadingFixedElements : Symbol(SubTup2VariadicWithLeadingFixedElements, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 47, 100))
136+
137+
type SubTup2TrailingVariadicWithTrailingFixedElements<T extends unknown[]> = T extends [
138+
>SubTup2TrailingVariadicWithTrailingFixedElements : Symbol(SubTup2TrailingVariadicWithTrailingFixedElements, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 58, 129))
139+
>T : Symbol(T, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 60, 54))
140+
>T : Symbol(T, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 60, 54))
141+
142+
...any,
143+
...infer B extends [any, any],
144+
>B : Symbol(B, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 62, 10))
145+
146+
any,
147+
]
148+
? B
149+
>B : Symbol(B, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 62, 10))
150+
151+
: never;
152+
153+
type SubTup2TrailingVariadicWithTrailingFixedElementsTest = SubTup2TrailingVariadicWithTrailingFixedElements<[...a: 0[], b: 1, c: 2, d: 3]>;
154+
>SubTup2TrailingVariadicWithTrailingFixedElementsTest : Symbol(SubTup2TrailingVariadicWithTrailingFixedElementsTest, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 66, 10))
155+
>SubTup2TrailingVariadicWithTrailingFixedElements : Symbol(SubTup2TrailingVariadicWithTrailingFixedElements, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 58, 129))
156+
157+
type SubTup2TrailingVariadicWithTrailingFixedElementsTest2 = SubTup2TrailingVariadicWithTrailingFixedElements<[...a: 0[], b: 1, c: 2, d: 3, e: 4]>;
158+
>SubTup2TrailingVariadicWithTrailingFixedElementsTest2 : Symbol(SubTup2TrailingVariadicWithTrailingFixedElementsTest2, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 68, 140))
159+
>SubTup2TrailingVariadicWithTrailingFixedElements : Symbol(SubTup2TrailingVariadicWithTrailingFixedElements, Decl(inferTypesWithFixedTupleExtendsAtVariadicPosition.ts, 58, 129))
160+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
=== tests/cases/compiler/inferTypesWithFixedTupleExtendsAtVariadicPosition.ts ===
2+
// repro #51138
3+
4+
type SubTup2FixedLength<T extends unknown[]> = T extends [
5+
>SubTup2FixedLength : SubTup2FixedLength<T>
6+
7+
...infer B extends [any, any],
8+
any
9+
]
10+
? B
11+
: never;
12+
13+
type SubTup2FixedLengthTest = SubTup2FixedLength<[a: 0, b: 1, c: 2]>;
14+
>SubTup2FixedLengthTest : [a: 0, b: 1]
15+
16+
type SubTup2Variadic<T extends unknown[]> = T extends [
17+
>SubTup2Variadic : SubTup2Variadic<T>
18+
19+
...infer B extends [any, any],
20+
...any
21+
]
22+
? B
23+
: never;
24+
25+
type SubTup2VariadicTest = SubTup2Variadic<[a: 0, b: 1, ...c: 2[]]>;
26+
>SubTup2VariadicTest : [a: 0, b: 1]
27+
28+
type SubTup2VariadicTest2 = SubTup2Variadic<[a: 0, b: 1, c: 2, ...d: 3[]]>;
29+
>SubTup2VariadicTest2 : [a: 0, b: 1]
30+
31+
type SubTup2VariadicAndRest<T extends unknown[]> = T extends [
32+
>SubTup2VariadicAndRest : SubTup2VariadicAndRest<T>
33+
34+
...infer B extends [any, any],
35+
...(infer C)[]
36+
]
37+
? [...B, ...[C]]
38+
: never;
39+
40+
type SubTup2VariadicAndRestTest = SubTup2VariadicAndRest<[a: 0, b: 1, ...c: 2[]]>;
41+
>SubTup2VariadicAndRestTest : [0, 1, 2]
42+
43+
type SubTup2TrailingVariadic<T extends unknown[]> = T extends [
44+
>SubTup2TrailingVariadic : SubTup2TrailingVariadic<T>
45+
46+
...any,
47+
...infer B extends [any, any],
48+
]
49+
? B
50+
: never;
51+
52+
type SubTup2TrailingVariadicTest = SubTup2TrailingVariadic<[...a: 0[], b: 1, c: 2]>;
53+
>SubTup2TrailingVariadicTest : [b: 1, c: 2]
54+
55+
type SubTup2TrailingVariadicTest2 = SubTup2TrailingVariadic<[...a: 0[], b: 1, c: 2, d: 3]>;
56+
>SubTup2TrailingVariadicTest2 : [c: 2, d: 3]
57+
58+
type SubTup2RestAndTrailingVariadic2<T extends unknown[]> = T extends [
59+
>SubTup2RestAndTrailingVariadic2 : SubTup2RestAndTrailingVariadic2<T>
60+
61+
...(infer C)[],
62+
...infer B extends [any, any],
63+
]
64+
? [C, ...B]
65+
: never;
66+
67+
type SubTup2RestAndTrailingVariadic2Test = SubTup2RestAndTrailingVariadic2<[...a: 0[], b: 1, c: 2]>;
68+
>SubTup2RestAndTrailingVariadic2Test : [0, 1, 2]
69+
70+
type SubTup2VariadicWithLeadingFixedElements<T extends unknown[]> = T extends [
71+
>SubTup2VariadicWithLeadingFixedElements : SubTup2VariadicWithLeadingFixedElements<T>
72+
73+
any,
74+
...infer B extends [any, any],
75+
...any
76+
]
77+
? B
78+
: never;
79+
80+
type SubTup2VariadicWithLeadingFixedElementsTest = SubTup2VariadicWithLeadingFixedElements<[a: 0, b: 1, c: 2, ...d: 3[]]>;
81+
>SubTup2VariadicWithLeadingFixedElementsTest : [b: 1, c: 2]
82+
83+
type SubTup2VariadicWithLeadingFixedElementsTest2 = SubTup2VariadicWithLeadingFixedElements<[a: 0, b: 1, c: 2, d: 3, ...e: 4[]]>;
84+
>SubTup2VariadicWithLeadingFixedElementsTest2 : [b: 1, c: 2]
85+
86+
type SubTup2TrailingVariadicWithTrailingFixedElements<T extends unknown[]> = T extends [
87+
>SubTup2TrailingVariadicWithTrailingFixedElements : SubTup2TrailingVariadicWithTrailingFixedElements<T>
88+
89+
...any,
90+
...infer B extends [any, any],
91+
any,
92+
]
93+
? B
94+
: never;
95+
96+
type SubTup2TrailingVariadicWithTrailingFixedElementsTest = SubTup2TrailingVariadicWithTrailingFixedElements<[...a: 0[], b: 1, c: 2, d: 3]>;
97+
>SubTup2TrailingVariadicWithTrailingFixedElementsTest : [b: 1, c: 2]
98+
99+
type SubTup2TrailingVariadicWithTrailingFixedElementsTest2 = SubTup2TrailingVariadicWithTrailingFixedElements<[...a: 0[], b: 1, c: 2, d: 3, e: 4]>;
100+
>SubTup2TrailingVariadicWithTrailingFixedElementsTest2 : [c: 2, d: 3]
101+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// @strict: true
2+
// @noEmit: true
3+
4+
// repro #51138
5+
6+
type SubTup2FixedLength<T extends unknown[]> = T extends [
7+
...infer B extends [any, any],
8+
any
9+
]
10+
? B
11+
: never;
12+
13+
type SubTup2FixedLengthTest = SubTup2FixedLength<[a: 0, b: 1, c: 2]>;
14+
15+
type SubTup2Variadic<T extends unknown[]> = T extends [
16+
...infer B extends [any, any],
17+
...any
18+
]
19+
? B
20+
: never;
21+
22+
type SubTup2VariadicTest = SubTup2Variadic<[a: 0, b: 1, ...c: 2[]]>;
23+
type SubTup2VariadicTest2 = SubTup2Variadic<[a: 0, b: 1, c: 2, ...d: 3[]]>;
24+
25+
type SubTup2VariadicAndRest<T extends unknown[]> = T extends [
26+
...infer B extends [any, any],
27+
...(infer C)[]
28+
]
29+
? [...B, ...[C]]
30+
: never;
31+
32+
type SubTup2VariadicAndRestTest = SubTup2VariadicAndRest<[a: 0, b: 1, ...c: 2[]]>;
33+
34+
type SubTup2TrailingVariadic<T extends unknown[]> = T extends [
35+
...any,
36+
...infer B extends [any, any],
37+
]
38+
? B
39+
: never;
40+
41+
type SubTup2TrailingVariadicTest = SubTup2TrailingVariadic<[...a: 0[], b: 1, c: 2]>;
42+
type SubTup2TrailingVariadicTest2 = SubTup2TrailingVariadic<[...a: 0[], b: 1, c: 2, d: 3]>;
43+
44+
type SubTup2RestAndTrailingVariadic2<T extends unknown[]> = T extends [
45+
...(infer C)[],
46+
...infer B extends [any, any],
47+
]
48+
? [C, ...B]
49+
: never;
50+
51+
type SubTup2RestAndTrailingVariadic2Test = SubTup2RestAndTrailingVariadic2<[...a: 0[], b: 1, c: 2]>;
52+
53+
type SubTup2VariadicWithLeadingFixedElements<T extends unknown[]> = T extends [
54+
any,
55+
...infer B extends [any, any],
56+
...any
57+
]
58+
? B
59+
: never;
60+
61+
type SubTup2VariadicWithLeadingFixedElementsTest = SubTup2VariadicWithLeadingFixedElements<[a: 0, b: 1, c: 2, ...d: 3[]]>;
62+
type SubTup2VariadicWithLeadingFixedElementsTest2 = SubTup2VariadicWithLeadingFixedElements<[a: 0, b: 1, c: 2, d: 3, ...e: 4[]]>;
63+
64+
type SubTup2TrailingVariadicWithTrailingFixedElements<T extends unknown[]> = T extends [
65+
...any,
66+
...infer B extends [any, any],
67+
any,
68+
]
69+
? B
70+
: never;
71+
72+
type SubTup2TrailingVariadicWithTrailingFixedElementsTest = SubTup2TrailingVariadicWithTrailingFixedElements<[...a: 0[], b: 1, c: 2, d: 3]>;
73+
type SubTup2TrailingVariadicWithTrailingFixedElementsTest2 = SubTup2TrailingVariadicWithTrailingFixedElements<[...a: 0[], b: 1, c: 2, d: 3, e: 4]>;

0 commit comments

Comments
 (0)