@@ -509,6 +509,149 @@ declare const key: Key;
509
509
510
510
foo?.[key]?.trim();
511
511
` ,
512
+ // https://github.com/typescript-eslint/typescript-eslint/issues/7700
513
+ `
514
+ type BrandedKey = string & { __brand: string };
515
+ type Foo = { [key: BrandedKey]: string } | null;
516
+ declare const foo: Foo;
517
+ const key = '1' as BrandedKey;
518
+ foo?.[key]?.trim();
519
+ ` ,
520
+ `
521
+ type BrandedKey<S extends string> = S & { __brand: string };
522
+ type Foo = { [key: string]: string; foo: 'foo'; bar: 'bar' } | null;
523
+ type Key = BrandedKey<'bar'> | BrandedKey<'foo'>;
524
+ declare const foo: Foo;
525
+ declare const key: Key;
526
+ foo?.[key].trim();
527
+ ` ,
528
+ `
529
+ type BrandedKey = string & { __brand: string };
530
+ interface Outer {
531
+ inner?: {
532
+ [key: BrandedKey]: string | undefined;
533
+ };
534
+ }
535
+ function Foo(outer: Outer, key: BrandedKey): number | undefined {
536
+ return outer.inner?.[key]?.charCodeAt(0);
537
+ }
538
+ ` ,
539
+ `
540
+ interface Outer {
541
+ inner?: {
542
+ [key: string & { __brand: string }]: string | undefined;
543
+ bar: 'bar';
544
+ };
545
+ }
546
+ type Foo = 'foo' & { __brand: string };
547
+ function Foo(outer: Outer, key: Foo): number | undefined {
548
+ return outer.inner?.[key]?.charCodeAt(0);
549
+ }
550
+ ` ,
551
+ `
552
+ type BrandedKey<S extends string> = S & { __brand: string };
553
+ type Foo = { [key: string]: string; foo: 'foo'; bar: 'bar' } | null;
554
+ type Key = BrandedKey<'bar'> | BrandedKey<'foo'> | BrandedKey<'baz'>;
555
+ declare const foo: Foo;
556
+ declare const key: Key;
557
+ foo?.[key]?.trim();
558
+ ` ,
559
+ {
560
+ code : `
561
+ type BrandedKey = string & { __brand: string };
562
+ type Foo = { [key: BrandedKey]: string } | null;
563
+ declare const foo: Foo;
564
+ const key = '1' as BrandedKey;
565
+ foo?.[key]?.trim();
566
+ ` ,
567
+ parserOptions : {
568
+ EXPERIMENTAL_useProjectService : false ,
569
+ tsconfigRootDir : getFixturesRootDir ( ) ,
570
+ project : './tsconfig.noUncheckedIndexedAccess.json' ,
571
+ } ,
572
+ dependencyConstraints : {
573
+ typescript : '4.1' ,
574
+ } ,
575
+ } ,
576
+ {
577
+ code : `
578
+ type BrandedKey<S extends string> = S & { __brand: string };
579
+ type Foo = { [key: string]: string; foo: 'foo'; bar: 'bar' } | null;
580
+ type Key = BrandedKey<'bar'> | BrandedKey<'foo'>;
581
+ declare const foo: Foo;
582
+ declare const key: Key;
583
+ foo?.[key].trim();
584
+ ` ,
585
+ parserOptions : {
586
+ EXPERIMENTAL_useProjectService : false ,
587
+ tsconfigRootDir : getFixturesRootDir ( ) ,
588
+ project : './tsconfig.noUncheckedIndexedAccess.json' ,
589
+ } ,
590
+ dependencyConstraints : {
591
+ typescript : '4.1' ,
592
+ } ,
593
+ } ,
594
+ {
595
+ code : `
596
+ type BrandedKey = string & { __brand: string };
597
+ interface Outer {
598
+ inner?: {
599
+ [key: BrandedKey]: string | undefined;
600
+ };
601
+ }
602
+ function Foo(outer: Outer, key: BrandedKey): number | undefined {
603
+ return outer.inner?.[key]?.charCodeAt(0);
604
+ }
605
+ ` ,
606
+ parserOptions : {
607
+ EXPERIMENTAL_useProjectService : false ,
608
+ tsconfigRootDir : getFixturesRootDir ( ) ,
609
+ project : './tsconfig.noUncheckedIndexedAccess.json' ,
610
+ } ,
611
+ dependencyConstraints : {
612
+ typescript : '4.1' ,
613
+ } ,
614
+ } ,
615
+ {
616
+ code : `
617
+ interface Outer {
618
+ inner?: {
619
+ [key: string & { __brand: string }]: string | undefined;
620
+ bar: 'bar';
621
+ };
622
+ }
623
+ type Foo = 'foo' & { __brand: string };
624
+ function Foo(outer: Outer, key: Foo): number | undefined {
625
+ return outer.inner?.[key]?.charCodeAt(0);
626
+ }
627
+ ` ,
628
+ parserOptions : {
629
+ EXPERIMENTAL_useProjectService : false ,
630
+ tsconfigRootDir : getFixturesRootDir ( ) ,
631
+ project : './tsconfig.noUncheckedIndexedAccess.json' ,
632
+ } ,
633
+ dependencyConstraints : {
634
+ typescript : '4.1' ,
635
+ } ,
636
+ } ,
637
+ {
638
+ code : `
639
+ type BrandedKey<S extends string> = S & { __brand: string };
640
+ type Foo = { [key: string]: string; foo: 'foo'; bar: 'bar' } | null;
641
+ type Key = BrandedKey<'bar'> | BrandedKey<'foo'> | BrandedKey<'baz'>;
642
+ declare const foo: Foo;
643
+ declare const key: Key;
644
+ foo?.[key]?.trim();
645
+ ` ,
646
+ parserOptions : {
647
+ EXPERIMENTAL_useProjectService : false ,
648
+ tsconfigRootDir : getFixturesRootDir ( ) ,
649
+ project : './tsconfig.noUncheckedIndexedAccess.json' ,
650
+ } ,
651
+ dependencyConstraints : {
652
+ typescript : '4.1' ,
653
+ } ,
654
+ } ,
512
655
`
513
656
let latencies: number[][] = [];
514
657
0 commit comments