@@ -299,6 +299,107 @@ type Foo = { [key: string]: unknown };
299299type NullableFoo = Foo | undefined;
300300
301301type 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+ }
302403
303404
304405//// [unknownControlFlow.js]
@@ -552,6 +653,95 @@ ff1(null, 'foo'); // Error
552653ff2(null, 'foo'); // Error
553654ff3(null, 'foo');
554655ff4(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+ }
555745
556746
557747//// [unknownControlFlow.d.ts]
@@ -601,3 +791,13 @@ type Foo = {
601791} ;
602792type NullableFoo = Foo | undefined;
603793type 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