Skip to content

Commit 5f128e7

Browse files
committed
Fix typing
1 parent a6ef778 commit 5f128e7

File tree

2 files changed

+16
-7
lines changed

2 files changed

+16
-7
lines changed

Diff for: src/pointer.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,21 @@ export type ReferencedValue<T> = NestedValue<T>;
3333
type NestedValue<T, U = never> = T | (
3434
T extends object
3535
? T extends U
36-
? never
36+
? NestedValue<Diff<T, U>, U>
3737
: T extends Array<infer I>
3838
? NestedValue<I, U | T>
39-
: T[keyof T] | NestedValue<T[keyof T], U | T>
39+
: NestedValue<T[keyof T], U | T>
4040
: never
4141
);
4242

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+
4351
/**
4452
* An error indicating a problem related to JSON pointer operations.
4553
*/

Diff for: src/relativePointer.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {
88
JsonPointerLike,
99
Entry,
1010
InvalidReferenceError,
11-
RootStructure,
1211
ReferencedValue,
1312
RootValue,
1413
} from './pointer';
@@ -349,7 +348,7 @@ export class JsonRelativePointer implements JsonConvertible {
349348
*
350349
* @throws {InvalidReferenceError} If the pointer references the root of the structure.
351350
*/
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 {
353352
if (this.isKeyPointer()) {
354353
throw new JsonPointerError('Cannot write to a key.');
355354
}
@@ -358,17 +357,19 @@ export class JsonRelativePointer implements JsonConvertible {
358357
const remainderPointer = this.getRemainderPointer();
359358

360359
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>;
362362
}
363363

364364
if (stack.length < 2) {
365365
throw new JsonPointerError('Cannot unset the root value.');
366366
}
367367

368368
const segment = stack[stack.length - 1][0]!;
369-
const structure = stack[stack.length - 2][1];
369+
const parent = stack[stack.length - 2][1];
370370

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>;
372373
}
373374

374375
/**

0 commit comments

Comments
 (0)