File tree 2 files changed +16
-7
lines changed
2 files changed +16
-7
lines changed Original file line number Diff line number Diff line change @@ -33,13 +33,21 @@ export type ReferencedValue<T> = NestedValue<T>;
33
33
type NestedValue < T , U = never > = T | (
34
34
T extends object
35
35
? T extends U
36
- ? never
36
+ ? NestedValue < Diff < T , U > , U >
37
37
: T extends Array < infer I >
38
38
? NestedValue < I , U | T >
39
- : T [ keyof T ] | NestedValue < T [ keyof T ] , U | T >
39
+ : NestedValue < T [ keyof T ] , U | T >
40
40
: never
41
41
) ;
42
42
43
+ type Diff < T extends object , M > = M extends infer U
44
+ ? T extends U
45
+ ? Exclude < keyof T , keyof U > extends never
46
+ ? never
47
+ : Pick < T , Exclude < keyof T , keyof U > >
48
+ : never
49
+ : never ;
50
+
43
51
/**
44
52
* An error indicating a problem related to JSON pointer operations.
45
53
*/
Original file line number Diff line number Diff line change 8
8
JsonPointerLike ,
9
9
Entry ,
10
10
InvalidReferenceError ,
11
- RootStructure ,
12
11
ReferencedValue ,
13
12
RootValue ,
14
13
} from './pointer' ;
@@ -349,7 +348,7 @@ export class JsonRelativePointer implements JsonConvertible {
349
348
*
350
349
* @throws {InvalidReferenceError } If the pointer references the root of the structure.
351
350
*/
352
- public unset < T extends RootStructure > ( root : T , pointer = JsonPointer . root ( ) ) : ReferencedValue < T > | undefined {
351
+ public unset < T extends RootValue > ( root : T , pointer = JsonPointer . root ( ) ) : ReferencedValue < T > | undefined {
353
352
if ( this . isKeyPointer ( ) ) {
354
353
throw new JsonPointerError ( 'Cannot write to a key.' ) ;
355
354
}
@@ -358,17 +357,19 @@ export class JsonRelativePointer implements JsonConvertible {
358
357
const remainderPointer = this . getRemainderPointer ( ) ;
359
358
360
359
if ( ! remainderPointer . isRoot ( ) ) {
361
- return remainderPointer . unset ( stack [ stack . length - 1 ] [ 1 ] ) ;
360
+ // Given V = typeof value, and typeof value ⊆ ReferencedValue<T> → ReferencedValue<K> ⊆ ReferencedValue<T>
361
+ return remainderPointer . unset ( stack [ stack . length - 1 ] [ 1 ] ) as ReferencedValue < T > ;
362
362
}
363
363
364
364
if ( stack . length < 2 ) {
365
365
throw new JsonPointerError ( 'Cannot unset the root value.' ) ;
366
366
}
367
367
368
368
const segment = stack [ stack . length - 1 ] [ 0 ] ! ;
369
- const structure = stack [ stack . length - 2 ] [ 1 ] ;
369
+ const parent = stack [ stack . length - 2 ] [ 1 ] ;
370
370
371
- return JsonPointer . from ( [ segment ] ) . unset ( structure ) ;
371
+ // Given V = typeof value, and typeof value ⊆ ReferencedValue<T> → ReferencedValue<K> ⊆ ReferencedValue<T>
372
+ return JsonPointer . from ( [ segment ] ) . unset ( parent ) as ReferencedValue < T > ;
372
373
}
373
374
374
375
/**
You can’t perform that action at this time.
0 commit comments