Skip to content

Commit 9b2d602

Browse files
committed
Add tests
1 parent d737eee commit 9b2d602

5 files changed

+269
-0
lines changed

tests/baselines/reference/strictSubtypeAndNarrowing.errors.txt

+31
Original file line numberDiff line numberDiff line change
@@ -146,4 +146,35 @@ tests/cases/compiler/strictSubtypeAndNarrowing.ts(129,26): error TS2322: Type '{
146146
!!! error TS2322: Type '{ x: number; y: number; }' is not assignable to type '{ x?: number | undefined; }'.
147147
!!! error TS2322: Object literal may only specify known properties, and 'y' does not exist in type '{ x?: number | undefined; }'.
148148
}
149+
150+
// Repros from #52827
151+
152+
declare function isArrayLike(value: any): value is { length: number };
153+
154+
function ff1(value: { [index: number]: boolean, length: number } | undefined) {
155+
if (isArrayLike(value)) {
156+
value;
157+
} else {
158+
value;
159+
}
160+
value;
161+
}
162+
163+
function ff2(value: { [index: number]: boolean, length: number } | string) {
164+
if (isArrayLike(value)) {
165+
value;
166+
} else {
167+
value;
168+
}
169+
value;
170+
}
171+
172+
function ff3(value: string | string[] | { [index: number]: boolean, length: number } | [number, boolean] | number | { length: string } | { a: string } | null | undefined) {
173+
if (isArrayLike(value)) {
174+
value;
175+
} else {
176+
value;
177+
}
178+
value;
179+
}
149180

tests/baselines/reference/strictSubtypeAndNarrowing.js

+58
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,37 @@ function fx11(): { x?: number } {
129129
let obj: { x?: number, y?: number };
130130
return obj = { x: 1, y: 2 };
131131
}
132+
133+
// Repros from #52827
134+
135+
declare function isArrayLike(value: any): value is { length: number };
136+
137+
function ff1(value: { [index: number]: boolean, length: number } | undefined) {
138+
if (isArrayLike(value)) {
139+
value;
140+
} else {
141+
value;
142+
}
143+
value;
144+
}
145+
146+
function ff2(value: { [index: number]: boolean, length: number } | string) {
147+
if (isArrayLike(value)) {
148+
value;
149+
} else {
150+
value;
151+
}
152+
value;
153+
}
154+
155+
function ff3(value: string | string[] | { [index: number]: boolean, length: number } | [number, boolean] | number | { length: string } | { a: string } | null | undefined) {
156+
if (isArrayLike(value)) {
157+
value;
158+
} else {
159+
value;
160+
}
161+
value;
162+
}
132163

133164

134165
//// [strictSubtypeAndNarrowing.js]
@@ -226,3 +257,30 @@ function fx11() {
226257
var obj;
227258
return obj = { x: 1, y: 2 };
228259
}
260+
function ff1(value) {
261+
if (isArrayLike(value)) {
262+
value;
263+
}
264+
else {
265+
value;
266+
}
267+
value;
268+
}
269+
function ff2(value) {
270+
if (isArrayLike(value)) {
271+
value;
272+
}
273+
else {
274+
value;
275+
}
276+
value;
277+
}
278+
function ff3(value) {
279+
if (isArrayLike(value)) {
280+
value;
281+
}
282+
else {
283+
value;
284+
}
285+
value;
286+
}

tests/baselines/reference/strictSubtypeAndNarrowing.symbols

+73
Original file line numberDiff line numberDiff line change
@@ -311,3 +311,76 @@ function fx11(): { x?: number } {
311311
>y : Symbol(y, Decl(strictSubtypeAndNarrowing.ts, 128, 24))
312312
}
313313

314+
// Repros from #52827
315+
316+
declare function isArrayLike(value: any): value is { length: number };
317+
>isArrayLike : Symbol(isArrayLike, Decl(strictSubtypeAndNarrowing.ts, 129, 1))
318+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 133, 29))
319+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 133, 29))
320+
>length : Symbol(length, Decl(strictSubtypeAndNarrowing.ts, 133, 52))
321+
322+
function ff1(value: { [index: number]: boolean, length: number } | undefined) {
323+
>ff1 : Symbol(ff1, Decl(strictSubtypeAndNarrowing.ts, 133, 70))
324+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 135, 13))
325+
>index : Symbol(index, Decl(strictSubtypeAndNarrowing.ts, 135, 23))
326+
>length : Symbol(length, Decl(strictSubtypeAndNarrowing.ts, 135, 47))
327+
328+
if (isArrayLike(value)) {
329+
>isArrayLike : Symbol(isArrayLike, Decl(strictSubtypeAndNarrowing.ts, 129, 1))
330+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 135, 13))
331+
332+
value;
333+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 135, 13))
334+
335+
} else {
336+
value;
337+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 135, 13))
338+
}
339+
value;
340+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 135, 13))
341+
}
342+
343+
function ff2(value: { [index: number]: boolean, length: number } | string) {
344+
>ff2 : Symbol(ff2, Decl(strictSubtypeAndNarrowing.ts, 142, 1))
345+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 144, 13))
346+
>index : Symbol(index, Decl(strictSubtypeAndNarrowing.ts, 144, 23))
347+
>length : Symbol(length, Decl(strictSubtypeAndNarrowing.ts, 144, 47))
348+
349+
if (isArrayLike(value)) {
350+
>isArrayLike : Symbol(isArrayLike, Decl(strictSubtypeAndNarrowing.ts, 129, 1))
351+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 144, 13))
352+
353+
value;
354+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 144, 13))
355+
356+
} else {
357+
value;
358+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 144, 13))
359+
}
360+
value;
361+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 144, 13))
362+
}
363+
364+
function ff3(value: string | string[] | { [index: number]: boolean, length: number } | [number, boolean] | number | { length: string } | { a: string } | null | undefined) {
365+
>ff3 : Symbol(ff3, Decl(strictSubtypeAndNarrowing.ts, 151, 1))
366+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 153, 13))
367+
>index : Symbol(index, Decl(strictSubtypeAndNarrowing.ts, 153, 43))
368+
>length : Symbol(length, Decl(strictSubtypeAndNarrowing.ts, 153, 67))
369+
>length : Symbol(length, Decl(strictSubtypeAndNarrowing.ts, 153, 117))
370+
>a : Symbol(a, Decl(strictSubtypeAndNarrowing.ts, 153, 138))
371+
372+
if (isArrayLike(value)) {
373+
>isArrayLike : Symbol(isArrayLike, Decl(strictSubtypeAndNarrowing.ts, 129, 1))
374+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 153, 13))
375+
376+
value;
377+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 153, 13))
378+
379+
} else {
380+
value;
381+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 153, 13))
382+
}
383+
value;
384+
>value : Symbol(value, Decl(strictSubtypeAndNarrowing.ts, 153, 13))
385+
}
386+

tests/baselines/reference/strictSubtypeAndNarrowing.types

+76
Original file line numberDiff line numberDiff line change
@@ -326,3 +326,79 @@ function fx11(): { x?: number } {
326326
>2 : 2
327327
}
328328

329+
// Repros from #52827
330+
331+
declare function isArrayLike(value: any): value is { length: number };
332+
>isArrayLike : (value: any) => value is { length: number; }
333+
>value : any
334+
>length : number
335+
336+
function ff1(value: { [index: number]: boolean, length: number } | undefined) {
337+
>ff1 : (value: { [index: number]: boolean; length: number; } | undefined) => void
338+
>value : { [index: number]: boolean; length: number; } | undefined
339+
>index : number
340+
>length : number
341+
342+
if (isArrayLike(value)) {
343+
>isArrayLike(value) : boolean
344+
>isArrayLike : (value: any) => value is { length: number; }
345+
>value : { [index: number]: boolean; length: number; } | undefined
346+
347+
value;
348+
>value : { [index: number]: boolean; length: number; }
349+
350+
} else {
351+
value;
352+
>value : undefined
353+
}
354+
value;
355+
>value : { [index: number]: boolean; length: number; } | undefined
356+
}
357+
358+
function ff2(value: { [index: number]: boolean, length: number } | string) {
359+
>ff2 : (value: string | { [index: number]: boolean; length: number; }) => void
360+
>value : string | { [index: number]: boolean; length: number; }
361+
>index : number
362+
>length : number
363+
364+
if (isArrayLike(value)) {
365+
>isArrayLike(value) : boolean
366+
>isArrayLike : (value: any) => value is { length: number; }
367+
>value : string | { [index: number]: boolean; length: number; }
368+
369+
value;
370+
>value : string | { [index: number]: boolean; length: number; }
371+
372+
} else {
373+
value;
374+
>value : never
375+
}
376+
value;
377+
>value : string | { [index: number]: boolean; length: number; }
378+
}
379+
380+
function ff3(value: string | string[] | { [index: number]: boolean, length: number } | [number, boolean] | number | { length: string } | { a: string } | null | undefined) {
381+
>ff3 : (value: string | number | { [index: number]: boolean; length: number; } | [number, boolean] | { length: string; } | { a: string; } | string[] | null | undefined) => void
382+
>value : string | number | { [index: number]: boolean; length: number; } | [number, boolean] | { length: string; } | { a: string; } | string[] | null | undefined
383+
>index : number
384+
>length : number
385+
>length : string
386+
>a : string
387+
>null : null
388+
389+
if (isArrayLike(value)) {
390+
>isArrayLike(value) : boolean
391+
>isArrayLike : (value: any) => value is { length: number; }
392+
>value : string | number | { [index: number]: boolean; length: number; } | [number, boolean] | { length: string; } | { a: string; } | string[] | null | undefined
393+
394+
value;
395+
>value : string | { [index: number]: boolean; length: number; } | [number, boolean] | string[]
396+
397+
} else {
398+
value;
399+
>value : number | { length: string; } | { a: string; } | null | undefined
400+
}
401+
value;
402+
>value : string | number | { [index: number]: boolean; length: number; } | [number, boolean] | { length: string; } | { a: string; } | string[] | null | undefined
403+
}
404+

tests/cases/compiler/strictSubtypeAndNarrowing.ts

+31
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,34 @@ function fx11(): { x?: number } {
130130
let obj: { x?: number, y?: number };
131131
return obj = { x: 1, y: 2 };
132132
}
133+
134+
// Repros from #52827
135+
136+
declare function isArrayLike(value: any): value is { length: number };
137+
138+
function ff1(value: { [index: number]: boolean, length: number } | undefined) {
139+
if (isArrayLike(value)) {
140+
value;
141+
} else {
142+
value;
143+
}
144+
value;
145+
}
146+
147+
function ff2(value: { [index: number]: boolean, length: number } | string) {
148+
if (isArrayLike(value)) {
149+
value;
150+
} else {
151+
value;
152+
}
153+
value;
154+
}
155+
156+
function ff3(value: string | string[] | { [index: number]: boolean, length: number } | [number, boolean] | number | { length: string } | { a: string } | null | undefined) {
157+
if (isArrayLike(value)) {
158+
value;
159+
} else {
160+
value;
161+
}
162+
value;
163+
}

0 commit comments

Comments
 (0)