@@ -299,6 +299,107 @@ type Foo = { [key: string]: unknown };
299
299
type NullableFoo = Foo | undefined;
300
300
301
301
type Bar< T extends NullableFoo > = NonNullable< T > [string];
302
+
303
+ // Generics and intersections with { }
304
+
305
+ function fx0< T > (value: T & ( { } | null)) {
306
+ if ( value === 42 ) {
307
+ value ; // T & {}
308
+ }
309
+ else {
310
+ value ; // T & ({} | null)
311
+ }
312
+ }
313
+
314
+ function fx1 < T extends unknown > (value: T & ( { } | null)) {
315
+ if ( value === 42 ) {
316
+ value ; // T & {}
317
+ }
318
+ else {
319
+ value ; // T & ({} | null)
320
+ }
321
+ }
322
+
323
+ function fx2 < T extends { } > (value: T & ( { } | null)) {
324
+ if ( value === 42 ) {
325
+ value ; // T & {}
326
+ }
327
+ else {
328
+ value ; // T & ({} | null)
329
+ }
330
+ }
331
+
332
+ function fx3 < T extends { } | undefined > (value: T & ( { } | null)) {
333
+ if ( value === 42 ) {
334
+ value ; // T & {}
335
+ }
336
+ else {
337
+ value ; // T & ({} | null)
338
+ }
339
+ }
340
+
341
+ function fx4 < T extends { } | null > (value: T & ( { } | null)) {
342
+ if ( value === 42 ) {
343
+ value ; // T & {}
344
+ }
345
+ else {
346
+ value ; // T & ({} | null)
347
+ }
348
+ }
349
+
350
+ function fx5 < T extends { } | null | undefined > (value: T & ( { } | null)) {
351
+ if ( value === 42 ) {
352
+ value ; // T & {}
353
+ }
354
+ else {
355
+ value ; // T & ({} | null)
356
+ }
357
+ }
358
+
359
+ // Double-equals narrowing
360
+
361
+ function fx10 ( x : string | number , y : number ) {
362
+ if ( x == y ) {
363
+ x ; // string | number
364
+ }
365
+ else {
366
+ x ; // string | number
367
+ }
368
+ if (x != y) {
369
+ x ; // string | number
370
+ }
371
+ else {
372
+ x ; // string | number
373
+ }
374
+ }
375
+
376
+ // Repros from #50706
377
+
378
+ function SendBlob ( encoding : unknown ) {
379
+ if ( encoding !== undefined && encoding !== 'utf8' ) {
380
+ throw new Error ( 'encoding' ) ;
381
+ }
382
+ encoding;
383
+ } ;
384
+
385
+ function doSomething1 < T extends unknown > (value: T): T {
386
+ if ( value === undefined ) {
387
+ return value ;
388
+ }
389
+ if (value === 42) {
390
+ throw Error ( 'Meaning of life value' ) ;
391
+ }
392
+ return value;
393
+ }
394
+
395
+ function doSomething2 ( value : unknown ) : void {
396
+ if ( value === undefined ) {
397
+ return ;
398
+ }
399
+ if (value === 42) {
400
+ value ;
401
+ }
402
+ }
302
403
303
404
304
405
//// [unknownControlFlow.js]
@@ -552,6 +653,95 @@ ff1(null, 'foo'); // Error
552
653
ff2(null, 'foo'); // Error
553
654
ff3(null, 'foo');
554
655
ff4(null, 'foo'); // Error
656
+ // Generics and intersections with { }
657
+ function fx0(value) {
658
+ if ( value === 42 ) {
659
+ value ; // T & {}
660
+ }
661
+ else {
662
+ value ; // T & ({} | null)
663
+ }
664
+ }
665
+ function fx1 ( value ) {
666
+ if ( value === 42 ) {
667
+ value ; // T & {}
668
+ }
669
+ else {
670
+ value ; // T & ({} | null)
671
+ }
672
+ }
673
+ function fx2 ( value ) {
674
+ if ( value === 42 ) {
675
+ value ; // T & {}
676
+ }
677
+ else {
678
+ value ; // T & ({} | null)
679
+ }
680
+ }
681
+ function fx3 ( value ) {
682
+ if ( value === 42 ) {
683
+ value ; // T & {}
684
+ }
685
+ else {
686
+ value ; // T & ({} | null)
687
+ }
688
+ }
689
+ function fx4 ( value ) {
690
+ if ( value === 42 ) {
691
+ value ; // T & {}
692
+ }
693
+ else {
694
+ value ; // T & ({} | null)
695
+ }
696
+ }
697
+ function fx5 ( value ) {
698
+ if ( value === 42 ) {
699
+ value ; // T & {}
700
+ }
701
+ else {
702
+ value ; // T & ({} | null)
703
+ }
704
+ }
705
+ // Double-equals narrowing
706
+ function fx10 ( x , y ) {
707
+ if ( x == y ) {
708
+ x ; // string | number
709
+ }
710
+ else {
711
+ x ; // string | number
712
+ }
713
+ if (x != y) {
714
+ x ; // string | number
715
+ }
716
+ else {
717
+ x ; // string | number
718
+ }
719
+ }
720
+ // Repros from #50706
721
+ function SendBlob ( encoding ) {
722
+ if ( encoding !== undefined && encoding !== 'utf8' ) {
723
+ throw new Error ( 'encoding' ) ;
724
+ }
725
+ encoding;
726
+ }
727
+ ;
728
+ function doSomething1 ( value ) {
729
+ if ( value === undefined ) {
730
+ return value ;
731
+ }
732
+ if (value === 42) {
733
+ throw Error ( 'Meaning of life value' ) ;
734
+ }
735
+ return value;
736
+ }
737
+ function doSomething2 ( value ) {
738
+ if ( value === undefined ) {
739
+ return ;
740
+ }
741
+ if (value === 42) {
742
+ value ;
743
+ }
744
+ }
555
745
556
746
557
747
//// [unknownControlFlow.d.ts]
@@ -601,3 +791,13 @@ type Foo = {
601
791
} ;
602
792
type NullableFoo = Foo | undefined;
603
793
type Bar< T extends NullableFoo > = NonNullable< T > [string];
794
+ declare function fx0< T > (value: T & ( { } | null)): void;
795
+ declare function fx1< T extends unknown > (value: T & ( { } | null)): void;
796
+ declare function fx2< T extends { } > (value: T & ( { } | null)): void;
797
+ declare function fx3< T extends { } | undefined > (value: T & ( { } | null)): void;
798
+ declare function fx4< T extends { } | null > (value: T & ( { } | null)): void;
799
+ declare function fx5< T extends { } | null | undefined > (value: T & ( { } | null)): void;
800
+ declare function fx10(x: string | number, y: number): void;
801
+ declare function SendBlob(encoding: unknown): void;
802
+ declare function doSomething1< T extends unknown > (value: T): T;
803
+ declare function doSomething2(value: unknown): void;
0 commit comments