@@ -441,23 +441,101 @@ describe('UpdateData - v9', () => {
441
441
}
442
442
} ;
443
443
444
- // preserves type - failure
445
- _ = {
446
- // @ts -expect-error
447
- 'indexed.bar' : false ,
448
- // @ts -expect-error
449
- 'indexed.baz' : 'string'
444
+ expect ( true ) . to . be . true ;
445
+ } ) ;
446
+ } ) ;
447
+
448
+ // v10 tests cover new scenarios that are fixed for v10
449
+ describe ( 'UpdateData - v10' , ( ) => {
450
+ interface MyV10ServerType {
451
+ booleanProperty : boolean ;
452
+
453
+ // index signatures nested 1 layer deep
454
+ indexed : {
455
+ [ name : string ] : {
456
+ booleanProperty : boolean ;
457
+ numberProperty : number ;
458
+ } ;
450
459
} ;
451
460
452
- // preserves properties of nested objects - failure
453
- _ = {
454
- 'indexed.bar' : {
455
- // @ts -expect-error
456
- booleanProperty : 'string'
457
- }
461
+ // index signatures nested 2 layers deep
462
+ layer : {
463
+ indexed : {
464
+ [ name : string ] : {
465
+ booleanProperty : boolean ;
466
+ numberProperty : number ;
467
+ } ;
468
+ } ;
458
469
} ;
470
+ }
459
471
460
- expect ( true ) . to . be . true ;
472
+ describe ( 'given nested objects with index properties' , ( ) => {
473
+ it ( 'supports object replacement at each layer (with partial)' , ( ) => {
474
+ // This unexpectidly fails in v9 when the object has index signature nested
475
+ // two layers deep (e.g. layer.indexed.[name]).
476
+ const _ : UpdateData < MyV10ServerType > = {
477
+ indexed : {
478
+ bar : { } ,
479
+ baz : { }
480
+ }
481
+ } ;
482
+
483
+ expect ( true ) . to . be . true ;
484
+ } ) ;
485
+
486
+ it ( 'allows dot notation for nested index types' , ( ) => {
487
+ let _ : UpdateData < MyV10ServerType > ;
488
+
489
+ // v10 allows 3 layers of dot notation
490
+
491
+ // allows the property
492
+ _ = {
493
+ 'indexed.bar.booleanProperty' : true
494
+ } ;
495
+
496
+ _ = {
497
+ 'indexed.bar.numberProperty' : 1
498
+ } ;
499
+
500
+ // does not enforce type
501
+ _ = {
502
+ 'indexed.bar.booleanProperty' : 'string value is not rejected'
503
+ } ;
504
+
505
+ _ = {
506
+ 'indexed.bar.numberProperty' : 'string value is not rejected'
507
+ } ;
508
+
509
+ // rejects properties that don't exist
510
+ _ = {
511
+ 'indexed.bar.unknown' : 'string value is not rejected'
512
+ } ;
513
+
514
+ expect ( true ) . to . be . true ;
515
+ } ) ;
516
+
517
+ it ( 'allows dot notation for nested index types that are 2 layers deep' , ( ) => {
518
+ let _ : UpdateData < MyV10ServerType > ;
519
+
520
+ // v10 3 layers with dot notation
521
+
522
+ // allows the property
523
+ _ = {
524
+ 'layer.indexed.bar.booleanProperty' : true
525
+ } ;
526
+
527
+ // allows the property, but does not enforce type
528
+ _ = {
529
+ 'layer.indexed.bar.booleanProperty' : 'string value is not rejected'
530
+ } ;
531
+
532
+ // Allows unknown properties in sub types
533
+ _ = {
534
+ 'layer.indexed.bar.unknownProperty' : 'This just allows anything'
535
+ } ;
536
+
537
+ expect ( true ) . to . be . true ;
538
+ } ) ;
461
539
} ) ;
462
540
} ) ;
463
541
} ) ;
0 commit comments