File: variadicTuples2.js

package info (click to toggle)
node-typescript 4.9.5%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 533,908 kB
  • sloc: javascript: 2,018,330; makefile: 7; sh: 1
file content (270 lines) | stat: -rw-r--r-- 9,602 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
//// [variadicTuples2.ts]
// Declarations

type V00 = [number, ...string[]];
type V01 = [...string[], number];
type V03 = [number, ...string[], number];

type V10 = [number, ...string[], ...boolean[]];  // Error
type V11 = [number, ...string[], boolean?];  // Error
type V12 = [number, string?, boolean];  // Error

// Normalization

type Tup3<T extends unknown[], U extends unknown[], V extends unknown[]> = [...T, ...U, ...V];

type V20 = Tup3<[number], string[], [number]>;  // [number, ...string[], number]
type V21 = Tup3<[number], [string?], [boolean]>;  // [number, string | undefined, boolean]
type V22 = Tup3<[number], string[], boolean[]>;  // [number, (string | boolean)[]]
type V23 = Tup3<[number], string[], [boolean?]>;  // [number, (string | boolean | undefined)[]]
type V24 = Tup3<[number], [boolean?], string[]>;  // [number, boolean?, ...string[]]
type V25 = Tup3<string[], number[], boolean[]>;  // (string | number | boolean)[]
type V26 = Tup3<string[], number[], [boolean]>;  // [...(string | number)[], boolean]
type V27 = Tup3<[number?], [string], [boolean?]>;  // [number | undefined, string, boolean?]

type V30<A extends unknown[]> = Tup3<A, string[], number[]>;  // [...A, ...(string | number)[]]
type V31<A extends unknown[]> = Tup3<string[], A, number[]>;  // (string | number | A[number])[]
type V32<A extends unknown[]> = Tup3<string[], number[], A>;  // [...(string | number)[], ...A]

type V40<A extends unknown[]> = Tup3<A, [string?], number[]>;  // [...A, string?, ...number[]]
type V41<A extends unknown[]> = Tup3<[string?], A, number[]>;  // [string?, ...A, ...number[]]
type V42<A extends unknown[]> = Tup3<[string?], number[], A>;  // [string?, ...number[], ...A]

type V50<A extends unknown[]> = Tup3<A, string[], [number?]>;  // [...A, ...(string | number | undefined)[]]
type V51<A extends unknown[]> = Tup3<string[], A, [number?]>;  // (string | number | A[number] | undefined)[]
type V52<A extends unknown[]> = Tup3<string[], [number?], A>;  // [...(string | number | undefined)[], ...A]

// Assignability

declare let tt1: [...string[], number];
tt1 = [5];
tt1 = ['abc', 5];
tt1 = ['abc', 'def', 5];
tt1 = ['abc', 'def', 5, 6];  // Error

declare function ft1(...args: [...strs: string[], num: number]): void;
ft1(5);
ft1('abc', 5);
ft1('abc', 'def', 5);
ft1('abc', 'def', 5, 6);  // Error

declare let tt2: [number, ...string[], number];
tt2 = [0];  // Error
tt2 = [0, 1];
tt2 = [0, 1, 2];  // Error
tt2 = [0, 'abc', 1];
tt2 = [0, 'abc', 'def', 1];
tt2 = [0, 'abc', 1, 'def'];  // Error
tt2 = [true, 'abc', 'def', 1];  // Error
tt2 = [0, 'abc', 'def', true];  // Error

declare function ft2(n1: number, ...rest: [...strs: string[], n2: number]): void;
ft2(0);  // Error
ft2(0, 1);
ft2(0, 1, 2);  // Error
ft2(0, 'abc', 1);
ft2(0, 'abc', 'def', 1);
ft2(0, 'abc', 1, 'def');  // Error
ft2(true, 'abc', 'def', 1);  // Error
ft2(0, 'abc', 'def', true);  // Error

function ft3<T extends unknown[]>(x: [number, ...T], y: [number, number], z: [number, ...number[]]) {
    x = y;  // Error
    x = z;  // Error
    y = x;  // Error
    z = x;  // Error
}

// Inference

function pipe<T extends readonly unknown[]>(...args: [...T, (...values: T) => void]) {
    const callback = args[args.length - 1] as (...values: T) => void;
    const values = args.slice(0, -1) as unknown as T;
    callback(...values);
}

pipe("foo", 123, true, (a, b, c) => {
    a;  // string
    b;  // number
    c;  // boolean
})

pipe("foo", 123, true, (...x) => {
    x;  // [string, number, boolean]
});

declare const sa: string[];

pipe(...sa, (...x) => {
    x;  // string[]
});

pipe(1, ...sa, 2, (...x) => {
    x;  // [number, ...string[], number]
    let qq = x[x.length - 1];
    let ww = x[0]
});

pipe<number[]>(1, 2, 3, 4);  // Error
pipe(...sa);  // Error

declare function fn1<T, U>(t: [...unknown[], T, U]): [T, U];
fn1([]);  // Error
fn1([1]);  // Error
fn1([1, 'abc']);  // [number, string]
fn1([1, 'abc', true]);  // [string, boolean]

declare function fn2<T, U>(t: [T, ...unknown[], U]): [T, U];
fn2([]);  // Error
fn2([1]);  // Error
fn2([1, 'abc']);  // [number, string]
fn2([1, 'abc', true]);  // [number, boolean]

// Repro from #39595

declare function foo<S extends readonly [string, ...string[]]>(...stringsAndNumber: readonly [...S, number]): [...S, number];
    
const a1 = foo('blah1', 1);
const b1 = foo('blah1', 'blah2', 1);
const c1 = foo(1);  // Error
const d1 = foo(1, 2);  // Error
const e1 = foo('blah1', 'blah2', 1, 2, 3);  // Error


//// [variadicTuples2.js]
"use strict";
// Declarations
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
        if (ar || !(i in from)) {
            if (!ar) ar = Array.prototype.slice.call(from, 0, i);
            ar[i] = from[i];
        }
    }
    return to.concat(ar || Array.prototype.slice.call(from));
};
tt1 = [5];
tt1 = ['abc', 5];
tt1 = ['abc', 'def', 5];
tt1 = ['abc', 'def', 5, 6]; // Error
ft1(5);
ft1('abc', 5);
ft1('abc', 'def', 5);
ft1('abc', 'def', 5, 6); // Error
tt2 = [0]; // Error
tt2 = [0, 1];
tt2 = [0, 1, 2]; // Error
tt2 = [0, 'abc', 1];
tt2 = [0, 'abc', 'def', 1];
tt2 = [0, 'abc', 1, 'def']; // Error
tt2 = [true, 'abc', 'def', 1]; // Error
tt2 = [0, 'abc', 'def', true]; // Error
ft2(0); // Error
ft2(0, 1);
ft2(0, 1, 2); // Error
ft2(0, 'abc', 1);
ft2(0, 'abc', 'def', 1);
ft2(0, 'abc', 1, 'def'); // Error
ft2(true, 'abc', 'def', 1); // Error
ft2(0, 'abc', 'def', true); // Error
function ft3(x, y, z) {
    x = y; // Error
    x = z; // Error
    y = x; // Error
    z = x; // Error
}
// Inference
function pipe() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var callback = args[args.length - 1];
    var values = args.slice(0, -1);
    callback.apply(void 0, values);
}
pipe("foo", 123, true, function (a, b, c) {
    a; // string
    b; // number
    c; // boolean
});
pipe("foo", 123, true, function () {
    var x = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        x[_i] = arguments[_i];
    }
    x; // [string, number, boolean]
});
pipe.apply(void 0, __spreadArray(__spreadArray([], sa, false), [function () {
        var x = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            x[_i] = arguments[_i];
        }
        x; // string[]
    }], false));
pipe.apply(void 0, __spreadArray(__spreadArray([1], sa, false), [2, function () {
        var x = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            x[_i] = arguments[_i];
        }
        x; // [number, ...string[], number]
        var qq = x[x.length - 1];
        var ww = x[0];
    }], false));
pipe(1, 2, 3, 4); // Error
pipe.apply(void 0, sa); // Error
fn1([]); // Error
fn1([1]); // Error
fn1([1, 'abc']); // [number, string]
fn1([1, 'abc', true]); // [string, boolean]
fn2([]); // Error
fn2([1]); // Error
fn2([1, 'abc']); // [number, string]
fn2([1, 'abc', true]); // [number, boolean]
var a1 = foo('blah1', 1);
var b1 = foo('blah1', 'blah2', 1);
var c1 = foo(1); // Error
var d1 = foo(1, 2); // Error
var e1 = foo('blah1', 'blah2', 1, 2, 3); // Error


//// [variadicTuples2.d.ts]
type V00 = [number, ...string[]];
type V01 = [...string[], number];
type V03 = [number, ...string[], number];
type V10 = [number, ...string[], ...boolean[]];
type V11 = [number, ...string[], boolean?];
type V12 = [number, string?, boolean];
type Tup3<T extends unknown[], U extends unknown[], V extends unknown[]> = [...T, ...U, ...V];
type V20 = Tup3<[number], string[], [number]>;
type V21 = Tup3<[number], [string?], [boolean]>;
type V22 = Tup3<[number], string[], boolean[]>;
type V23 = Tup3<[number], string[], [boolean?]>;
type V24 = Tup3<[number], [boolean?], string[]>;
type V25 = Tup3<string[], number[], boolean[]>;
type V26 = Tup3<string[], number[], [boolean]>;
type V27 = Tup3<[number?], [string], [boolean?]>;
type V30<A extends unknown[]> = Tup3<A, string[], number[]>;
type V31<A extends unknown[]> = Tup3<string[], A, number[]>;
type V32<A extends unknown[]> = Tup3<string[], number[], A>;
type V40<A extends unknown[]> = Tup3<A, [string?], number[]>;
type V41<A extends unknown[]> = Tup3<[string?], A, number[]>;
type V42<A extends unknown[]> = Tup3<[string?], number[], A>;
type V50<A extends unknown[]> = Tup3<A, string[], [number?]>;
type V51<A extends unknown[]> = Tup3<string[], A, [number?]>;
type V52<A extends unknown[]> = Tup3<string[], [number?], A>;
declare let tt1: [...string[], number];
declare function ft1(...args: [...strs: string[], num: number]): void;
declare let tt2: [number, ...string[], number];
declare function ft2(n1: number, ...rest: [...strs: string[], n2: number]): void;
declare function ft3<T extends unknown[]>(x: [number, ...T], y: [number, number], z: [number, ...number[]]): void;
declare function pipe<T extends readonly unknown[]>(...args: [...T, (...values: T) => void]): void;
declare const sa: string[];
declare function fn1<T, U>(t: [...unknown[], T, U]): [T, U];
declare function fn2<T, U>(t: [T, ...unknown[], U]): [T, U];
declare function foo<S extends readonly [string, ...string[]]>(...stringsAndNumber: readonly [...S, number]): [...S, number];
declare const a1: ["blah1", number];
declare const b1: ["blah1", "blah2", number];
declare const c1: [string, ...string[], number];
declare const d1: [string, ...string[], number];
declare const e1: [string, ...string[], number];