Skip to content

Commit c776339

Browse files
committed
Fix unsound Array.concat() typings
1 parent 3dd7b84 commit c776339

23 files changed

+83
-53
lines changed

src/lib/es5.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,7 +1085,7 @@ interface ReadonlyArray<T> {
10851085
* Combines two or more arrays.
10861086
* @param items Additional items to add to the end of array1.
10871087
*/
1088-
concat(...items: (T | ConcatArray<T>)[]): T[];
1088+
concat<U extends T | ConcatArray<T>>(...items: U[]): (U extends ConcatArray<infer V> ? T | V : T)[];
10891089
/**
10901090
* Adds all the elements of an array separated by the specified separator string.
10911091
* @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma.
@@ -1213,7 +1213,7 @@ interface Array<T> {
12131213
* Combines two or more arrays.
12141214
* @param items Additional items to add to the end of array1.
12151215
*/
1216-
concat(...items: (T | ConcatArray<T>)[]): T[];
1216+
concat<U extends T | ConcatArray<T>>(...items: U[]): (U extends ConcatArray<infer V> ? T | V : T)[];
12171217
/**
12181218
* Adds all the elements of an array separated by the specified separator string.
12191219
* @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma.

tests/baselines/reference/arrayConcat2.types

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ var a: string[] = [];
55

66
a.concat("hello", 'world');
77
>a.concat("hello", 'world') : string[]
8-
>a.concat : { (...items: ConcatArray<string>[]): string[]; (...items: (string | ConcatArray<string>)[]): string[]; }
8+
>a.concat : { (...items: ConcatArray<string>[]): string[]; <U extends string | ConcatArray<string>>(...items: U[]): (U extends ConcatArray<infer V> ? string | V : string)[]; }
99
>a : string[]
10-
>concat : { (...items: ConcatArray<string>[]): string[]; (...items: (string | ConcatArray<string>)[]): string[]; }
10+
>concat : { (...items: ConcatArray<string>[]): string[]; <U extends string | ConcatArray<string>>(...items: U[]): (U extends ConcatArray<infer V> ? string | V : string)[]; }
1111
>"hello" : "hello"
1212
>'world' : "world"
1313

1414
a.concat('Hello');
1515
>a.concat('Hello') : string[]
16-
>a.concat : { (...items: ConcatArray<string>[]): string[]; (...items: (string | ConcatArray<string>)[]): string[]; }
16+
>a.concat : { (...items: ConcatArray<string>[]): string[]; <U extends string | ConcatArray<string>>(...items: U[]): (U extends ConcatArray<infer V> ? string | V : string)[]; }
1717
>a : string[]
18-
>concat : { (...items: ConcatArray<string>[]): string[]; (...items: (string | ConcatArray<string>)[]): string[]; }
18+
>concat : { (...items: ConcatArray<string>[]): string[]; <U extends string | ConcatArray<string>>(...items: U[]): (U extends ConcatArray<infer V> ? string | V : string)[]; }
1919
>'Hello' : "Hello"
2020

2121
var b = new Array<string>();
@@ -25,8 +25,8 @@ var b = new Array<string>();
2525

2626
b.concat('hello');
2727
>b.concat('hello') : string[]
28-
>b.concat : { (...items: ConcatArray<string>[]): string[]; (...items: (string | ConcatArray<string>)[]): string[]; }
28+
>b.concat : { (...items: ConcatArray<string>[]): string[]; <U extends string | ConcatArray<string>>(...items: U[]): (U extends ConcatArray<infer V> ? string | V : string)[]; }
2929
>b : string[]
30-
>concat : { (...items: ConcatArray<string>[]): string[]; (...items: (string | ConcatArray<string>)[]): string[]; }
30+
>concat : { (...items: ConcatArray<string>[]): string[]; <U extends string | ConcatArray<string>>(...items: U[]): (U extends ConcatArray<infer V> ? string | V : string)[]; }
3131
>'hello' : "hello"
3232

tests/baselines/reference/arrayConcat3.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ function doStuff<T extends object, T1 extends T>(a: Array<Fn<T>>, b: Array<Fn<T1
1111

1212
b.concat(a);
1313
>b.concat(a) : Fn<T1>[]
14-
>b.concat : { (...items: ConcatArray<Fn<T1>>[]): Fn<T1>[]; (...items: (Fn<T1> | ConcatArray<Fn<T1>>)[]): Fn<T1>[]; }
14+
>b.concat : { (...items: ConcatArray<Fn<T1>>[]): Fn<T1>[]; <U extends Fn<T1> | ConcatArray<Fn<T1>>>(...items: U[]): (U extends ConcatArray<infer V> ? Fn<T1> | V : Fn<T1>)[]; }
1515
>b : Fn<T1>[]
16-
>concat : { (...items: ConcatArray<Fn<T1>>[]): Fn<T1>[]; (...items: (Fn<T1> | ConcatArray<Fn<T1>>)[]): Fn<T1>[]; }
16+
>concat : { (...items: ConcatArray<Fn<T1>>[]): Fn<T1>[]; <U extends Fn<T1> | ConcatArray<Fn<T1>>>(...items: U[]): (U extends ConcatArray<infer V> ? Fn<T1> | V : Fn<T1>)[]; }
1717
>a : Fn<T>[]
1818
}
1919

tests/baselines/reference/arrayConcatMap.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ var x = [].concat([{ a: 1 }], [{ a: 2 }])
44
>[].concat([{ a: 1 }], [{ a: 2 }]) .map(b => b.a) : any[]
55
>[].concat([{ a: 1 }], [{ a: 2 }]) .map : <U>(callbackfn: (value: any, index: number, array: any[]) => U, thisArg?: any) => U[]
66
>[].concat([{ a: 1 }], [{ a: 2 }]) : any[]
7-
>[].concat : { (...items: ConcatArray<any>[]): any[]; (...items: any[]): any[]; }
7+
>[].concat : { (...items: ConcatArray<any>[]): any[]; <U extends any>(...items: U[]): (U extends ConcatArray<infer V> ? any : any)[]; }
88
>[] : undefined[]
9-
>concat : { (...items: ConcatArray<any>[]): any[]; (...items: any[]): any[]; }
9+
>concat : { (...items: ConcatArray<any>[]): any[]; <U extends any>(...items: U[]): (U extends ConcatArray<infer V> ? any : any)[]; }
1010
>[{ a: 1 }] : { a: number; }[]
1111
>{ a: 1 } : { a: number; }
1212
>a : number

tests/baselines/reference/concatError.types

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,19 @@ fa = fa.concat([0]);
1515
>fa = fa.concat([0]) : number[]
1616
>fa : number[]
1717
>fa.concat([0]) : number[]
18-
>fa.concat : { (...items: ConcatArray<number>[]): number[]; (...items: (number | ConcatArray<number>)[]): number[]; }
18+
>fa.concat : { (...items: ConcatArray<number>[]): number[]; <U extends number | ConcatArray<number>>(...items: U[]): (U extends ConcatArray<infer V> ? number | V : number)[]; }
1919
>fa : number[]
20-
>concat : { (...items: ConcatArray<number>[]): number[]; (...items: (number | ConcatArray<number>)[]): number[]; }
20+
>concat : { (...items: ConcatArray<number>[]): number[]; <U extends number | ConcatArray<number>>(...items: U[]): (U extends ConcatArray<infer V> ? number | V : number)[]; }
2121
>[0] : number[]
2222
>0 : 0
2323

2424
fa = fa.concat(0);
2525
>fa = fa.concat(0) : number[]
2626
>fa : number[]
2727
>fa.concat(0) : number[]
28-
>fa.concat : { (...items: ConcatArray<number>[]): number[]; (...items: (number | ConcatArray<number>)[]): number[]; }
28+
>fa.concat : { (...items: ConcatArray<number>[]): number[]; <U extends number | ConcatArray<number>>(...items: U[]): (U extends ConcatArray<infer V> ? number | V : number)[]; }
2929
>fa : number[]
30-
>concat : { (...items: ConcatArray<number>[]): number[]; (...items: (number | ConcatArray<number>)[]): number[]; }
30+
>concat : { (...items: ConcatArray<number>[]): number[]; <U extends number | ConcatArray<number>>(...items: U[]): (U extends ConcatArray<infer V> ? number | V : number)[]; }
3131
>0 : 0
3232

3333

tests/baselines/reference/concatTuples.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ ijs = ijs.concat([[3, 4], [5, 6]]);
1010
>ijs = ijs.concat([[3, 4], [5, 6]]) : [number, number][]
1111
>ijs : [number, number][]
1212
>ijs.concat([[3, 4], [5, 6]]) : [number, number][]
13-
>ijs.concat : { (...items: ConcatArray<[number, number]>[]): [number, number][]; (...items: ([number, number] | ConcatArray<[number, number]>)[]): [number, number][]; }
13+
>ijs.concat : { (...items: ConcatArray<[number, number]>[]): [number, number][]; <U extends [number, number] | ConcatArray<[number, number]>>(...items: U[]): (U extends ConcatArray<infer V> ? [number, number] | V : [number, number])[]; }
1414
>ijs : [number, number][]
15-
>concat : { (...items: ConcatArray<[number, number]>[]): [number, number][]; (...items: ([number, number] | ConcatArray<[number, number]>)[]): [number, number][]; }
15+
>concat : { (...items: ConcatArray<[number, number]>[]): [number, number][]; <U extends [number, number] | ConcatArray<[number, number]>>(...items: U[]): (U extends ConcatArray<infer V> ? [number, number] | V : [number, number])[]; }
1616
>[[3, 4], [5, 6]] : [number, number][]
1717
>[3, 4] : [number, number]
1818
>3 : 3
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
tests/cases/compiler/contextualExpressionTypecheckingDoesntBlowStack.ts(16,17): error TS2322: Type 'unknown[]' is not assignable to type 'IValidationError[]'.
2+
Type 'unknown' is not assignable to type 'IValidationError'.
3+
4+
5+
==== tests/cases/compiler/contextualExpressionTypecheckingDoesntBlowStack.ts (1 errors) ====
6+
// repro for: https://github.com/Microsoft/TypeScript/issues/23661
7+
export interface IValidationError {
8+
message: string;
9+
}
10+
11+
export default class Operation {
12+
validateParameters(parameterValues: any) : IValidationError[] | null {
13+
let result: IValidationError[] | null = null;
14+
for(const parameterLocation of Object.keys(parameterValues)) {
15+
const parameter: any = (this as any).getParameter();;
16+
const values = (this as any).getValues();
17+
18+
const innerResult = parameter.validate(values[parameter.oaParameter.name]);
19+
if(innerResult && innerResult.length > 0) {
20+
// Commenting out this line will fix the problem.
21+
result = (result || []).concat(innerResult);
22+
~~~~~~
23+
!!! error TS2322: Type 'unknown[]' is not assignable to type 'IValidationError[]'.
24+
!!! error TS2322: Type 'unknown' is not assignable to type 'IValidationError'.
25+
}
26+
}
27+
28+
return result;
29+
}
30+
}

tests/baselines/reference/contextualExpressionTypecheckingDoesntBlowStack.types

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,15 @@ export default class Operation {
6969

7070
// Commenting out this line will fix the problem.
7171
result = (result || []).concat(innerResult);
72-
>result = (result || []).concat(innerResult) : IValidationError[]
72+
>result = (result || []).concat(innerResult) : unknown[]
7373
>result : IValidationError[] | null
74-
>(result || []).concat(innerResult) : IValidationError[]
75-
>(result || []).concat : { (...items: ConcatArray<IValidationError>[]): IValidationError[]; (...items: (IValidationError | ConcatArray<IValidationError>)[]): IValidationError[]; }
74+
>(result || []).concat(innerResult) : unknown[]
75+
>(result || []).concat : { (...items: ConcatArray<IValidationError>[]): IValidationError[]; <U extends IValidationError | ConcatArray<IValidationError>>(...items: U[]): (U extends ConcatArray<infer V> ? IValidationError | V : IValidationError)[]; }
7676
>(result || []) : IValidationError[]
7777
>result || [] : IValidationError[]
7878
>result : IValidationError[] | null
7979
>[] : never[]
80-
>concat : { (...items: ConcatArray<IValidationError>[]): IValidationError[]; (...items: (IValidationError | ConcatArray<IValidationError>)[]): IValidationError[]; }
80+
>concat : { (...items: ConcatArray<IValidationError>[]): IValidationError[]; <U extends IValidationError | ConcatArray<IValidationError>>(...items: U[]): (U extends ConcatArray<infer V> ? IValidationError | V : IValidationError)[]; }
8181
>innerResult : any
8282
}
8383
}

tests/baselines/reference/destructuringTuple.types

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ const [oops1] = [1, 2, 3].reduce((accu, el) => accu.concat(el), []);
3535
>accu : []
3636
>el : number
3737
>accu.concat(el) : any
38-
>accu.concat : { (...items: ConcatArray<never>[]): never[]; (...items: ConcatArray<never>[]): never[]; }
38+
>accu.concat : { (...items: ConcatArray<never>[]): never[]; <U extends ConcatArray<never>>(...items: U[]): (U extends ConcatArray<infer V> ? V : never)[]; }
3939
>accu : []
40-
>concat : { (...items: ConcatArray<never>[]): never[]; (...items: ConcatArray<never>[]): never[]; }
40+
>concat : { (...items: ConcatArray<never>[]): never[]; <U extends ConcatArray<never>>(...items: U[]): (U extends ConcatArray<infer V> ? V : never)[]; }
4141
>el : number
4242
>[] : []
4343

@@ -54,9 +54,9 @@ const [oops2] = [1, 2, 3].reduce((acc: number[], e) => acc.concat(e), []);
5454
>acc : number[]
5555
>e : number
5656
>acc.concat(e) : number[]
57-
>acc.concat : { (...items: ConcatArray<number>[]): number[]; (...items: (number | ConcatArray<number>)[]): number[]; }
57+
>acc.concat : { (...items: ConcatArray<number>[]): number[]; <U extends number | ConcatArray<number>>(...items: U[]): (U extends ConcatArray<infer V> ? number | V : number)[]; }
5858
>acc : number[]
59-
>concat : { (...items: ConcatArray<number>[]): number[]; (...items: (number | ConcatArray<number>)[]): number[]; }
59+
>concat : { (...items: ConcatArray<number>[]): number[]; <U extends number | ConcatArray<number>>(...items: U[]): (U extends ConcatArray<infer V> ? number | V : number)[]; }
6060
>e : number
6161
>[] : never[]
6262

tests/baselines/reference/emitSkipsThisWithRestParameter.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ function rebase(fn: (base: any, ...args: any[]) => any): (...args: any[]) => any
1818
>apply : (this: Function, thisArg: any, argArray?: any) => any
1919
>this : any
2020
>[ this ].concat(args) : any[]
21-
>[ this ].concat : { (...items: ConcatArray<any>[]): any[]; (...items: any[]): any[]; }
21+
>[ this ].concat : { (...items: ConcatArray<any>[]): any[]; <U extends any>(...items: U[]): (U extends ConcatArray<infer V> ? any : any)[]; }
2222
>[ this ] : any[]
2323
>this : any
24-
>concat : { (...items: ConcatArray<any>[]): any[]; (...items: any[]): any[]; }
24+
>concat : { (...items: ConcatArray<any>[]): any[]; <U extends any>(...items: U[]): (U extends ConcatArray<infer V> ? any : any)[]; }
2525
>args : any[]
2626

2727
};

tests/baselines/reference/intersectionTypeInference3.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ declare const b: Set<A>;
2424
const c1 = Array.from(a).concat(Array.from(b));
2525
>c1 : Nominal<"A", string>[]
2626
>Array.from(a).concat(Array.from(b)) : Nominal<"A", string>[]
27-
>Array.from(a).concat : { (...items: ConcatArray<Nominal<"A", string>>[]): Nominal<"A", string>[]; (...items: (Nominal<"A", string> | ConcatArray<Nominal<"A", string>>)[]): Nominal<"A", string>[]; }
27+
>Array.from(a).concat : { (...items: ConcatArray<Nominal<"A", string>>[]): Nominal<"A", string>[]; <U extends Nominal<"A", string> | ConcatArray<Nominal<"A", string>>>(...items: U[]): (U extends ConcatArray<infer V> ? Nominal<"A", string> | V : Nominal<"A", string>)[]; }
2828
>Array.from(a) : Nominal<"A", string>[]
2929
>Array.from : { <T>(arrayLike: ArrayLike<T>): T[]; <T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; <T>(iterable: Iterable<T> | ArrayLike<T>): T[]; <T, U>(iterable: Iterable<T> | ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; }
3030
>Array : ArrayConstructor
3131
>from : { <T>(arrayLike: ArrayLike<T>): T[]; <T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; <T>(iterable: Iterable<T> | ArrayLike<T>): T[]; <T, U>(iterable: Iterable<T> | ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; }
3232
>a : Set<Nominal<"A", string>>
33-
>concat : { (...items: ConcatArray<Nominal<"A", string>>[]): Nominal<"A", string>[]; (...items: (Nominal<"A", string> | ConcatArray<Nominal<"A", string>>)[]): Nominal<"A", string>[]; }
33+
>concat : { (...items: ConcatArray<Nominal<"A", string>>[]): Nominal<"A", string>[]; <U extends Nominal<"A", string> | ConcatArray<Nominal<"A", string>>>(...items: U[]): (U extends ConcatArray<infer V> ? Nominal<"A", string> | V : Nominal<"A", string>)[]; }
3434
>Array.from(b) : Nominal<"A", string>[]
3535
>Array.from : { <T>(arrayLike: ArrayLike<T>): T[]; <T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; <T>(iterable: Iterable<T> | ArrayLike<T>): T[]; <T, U>(iterable: Iterable<T> | ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; }
3636
>Array : ArrayConstructor

tests/baselines/reference/iteratorSpreadInArray6.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ var array: number[] = [0, 1];
3939

4040
array.concat([...new SymbolIterator]);
4141
>array.concat([...new SymbolIterator]) : any
42-
>array.concat : { (...items: ConcatArray<number>[]): number[]; (...items: (number | ConcatArray<number>)[]): number[]; }
42+
>array.concat : { (...items: ConcatArray<number>[]): number[]; <U extends number | ConcatArray<number>>(...items: U[]): (U extends ConcatArray<infer V> ? number | V : number)[]; }
4343
>array : number[]
44-
>concat : { (...items: ConcatArray<number>[]): number[]; (...items: (number | ConcatArray<number>)[]): number[]; }
44+
>concat : { (...items: ConcatArray<number>[]): number[]; <U extends number | ConcatArray<number>>(...items: U[]): (U extends ConcatArray<infer V> ? number | V : number)[]; }
4545
>[...new SymbolIterator] : symbol[]
4646
>...new SymbolIterator : symbol
4747
>new SymbolIterator : SymbolIterator

tests/baselines/reference/iteratorSpreadInArray7.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ var array: symbol[];
3636

3737
array.concat([...new SymbolIterator]);
3838
>array.concat([...new SymbolIterator]) : symbol[]
39-
>array.concat : { (...items: ConcatArray<symbol>[]): symbol[]; (...items: (symbol | ConcatArray<symbol>)[]): symbol[]; }
39+
>array.concat : { (...items: ConcatArray<symbol>[]): symbol[]; <U extends symbol | ConcatArray<symbol>>(...items: U[]): (U extends ConcatArray<infer V> ? symbol | V : symbol)[]; }
4040
>array : symbol[]
41-
>concat : { (...items: ConcatArray<symbol>[]): symbol[]; (...items: (symbol | ConcatArray<symbol>)[]): symbol[]; }
41+
>concat : { (...items: ConcatArray<symbol>[]): symbol[]; <U extends symbol | ConcatArray<symbol>>(...items: U[]): (U extends ConcatArray<infer V> ? symbol | V : symbol)[]; }
4242
>[...new SymbolIterator] : symbol[]
4343
>...new SymbolIterator : symbol
4444
>new SymbolIterator : SymbolIterator

tests/baselines/reference/mappedTypesArraysTuples.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,9 @@ function f2<T extends any[]>(a: Boxified<T>) {
214214
let y: Box<any>[] = a.concat(a);
215215
>y : Box<any>[]
216216
>a.concat(a) : Box<any>[]
217-
>a.concat : { (...items: ConcatArray<Box<any>>[]): Box<any>[]; (...items: (Box<any> | ConcatArray<Box<any>>)[]): Box<any>[]; }
217+
>a.concat : { (...items: ConcatArray<Box<any>>[]): Box<any>[]; <U extends Box<any> | ConcatArray<Box<any>>>(...items: U[]): (U extends ConcatArray<infer V> ? Box<any> | V : Box<any>)[]; }
218218
>a : Boxified<T>
219-
>concat : { (...items: ConcatArray<Box<any>>[]): Box<any>[]; (...items: (Box<any> | ConcatArray<Box<any>>)[]): Box<any>[]; }
219+
>concat : { (...items: ConcatArray<Box<any>>[]): Box<any>[]; <U extends Box<any> | ConcatArray<Box<any>>>(...items: U[]): (U extends ConcatArray<infer V> ? Box<any> | V : Box<any>)[]; }
220220
>a : Boxified<T>
221221
}
222222

tests/baselines/reference/parserRealSource4.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,14 +418,14 @@ module TypeScript {
418418

419419
return this.primaryTable.getAllKeys().concat(this.secondaryTable.getAllKeys());
420420
>this.primaryTable.getAllKeys().concat(this.secondaryTable.getAllKeys()) : string[]
421-
>this.primaryTable.getAllKeys().concat : { (...items: ConcatArray<string>[]): string[]; (...items: (string | ConcatArray<string>)[]): string[]; }
421+
>this.primaryTable.getAllKeys().concat : { (...items: ConcatArray<string>[]): string[]; <U extends string | ConcatArray<string>>(...items: U[]): (U extends ConcatArray<infer V> ? string | V : string)[]; }
422422
>this.primaryTable.getAllKeys() : string[]
423423
>this.primaryTable.getAllKeys : () => string[]
424424
>this.primaryTable : IHashTable
425425
>this : this
426426
>primaryTable : IHashTable
427427
>getAllKeys : () => string[]
428-
>concat : { (...items: ConcatArray<string>[]): string[]; (...items: (string | ConcatArray<string>)[]): string[]; }
428+
>concat : { (...items: ConcatArray<string>[]): string[]; <U extends string | ConcatArray<string>>(...items: U[]): (U extends ConcatArray<infer V> ? string | V : string)[]; }
429429
>this.secondaryTable.getAllKeys() : string[]
430430
>this.secondaryTable.getAllKeys : () => string[]
431431
>this.secondaryTable : IHashTable

tests/baselines/reference/parserharness.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4775,9 +4775,9 @@ module Harness {
47754775
>lines = lines.concat(v.file.lines) : any[]
47764776
>lines : any[]
47774777
>lines.concat(v.file.lines) : any[]
4778-
>lines.concat : { (...items: ConcatArray<any>[]): any[]; (...items: any[]): any[]; }
4778+
>lines.concat : { (...items: ConcatArray<any>[]): any[]; <U extends any>(...items: U[]): (U extends ConcatArray<infer V> ? any : any)[]; }
47794779
>lines : any[]
4780-
>concat : { (...items: ConcatArray<any>[]): any[]; (...items: any[]): any[]; }
4780+
>concat : { (...items: ConcatArray<any>[]): any[]; <U extends any>(...items: U[]): (U extends ConcatArray<infer V> ? any : any)[]; }
47814781
>v.file.lines : string[]
47824782
>v.file : WriterAggregator
47834783
>v : { filename: string; file: WriterAggregator; }

0 commit comments

Comments
 (0)