TypeScript - inskränk typ med funktionspåståenden


Jag försöker få TS att begränsa en typ som jag manuellt ändrar i en funktion:

interface Node {
  parent: string | null;
}

interface NoParent extends Node {
  parent: null;
}

interface HasParent extends Node {
  parent: string;
}

// Node -> HasParent
// ok, Node now known to have parent
export const setParent = (n: Node): asserts n is HasParent => {
  n.parent = 'parent added';
};

// Node -> NoParent
// ok, Node now known to have no parent
export const unsetParent = (n: Node): asserts n is NoParent => {
  n.parent = null;
};

// NoParent -> HasParent
// error: A type predicate's type must be assignable to its parameter's type.
export const addParent = (n: NoParent): asserts n is HasParent => {
  // ... use n as NoParent ...

  (n as Node).parent = 'parent';
};

// HasParent -> NoParent
// error: A type predicate's type must be assignable to its parameter's type.
export const removeParent = (n: HasParent): asserts n is NoParent => {
  // ... use n as HasParent ...

  (n as Node).parent = null;
};

Jag behöver skriva addParent och removeParent med en specifik typ (inte Node) eftersom de funktionerna också fungerar som typvakter i den anropande koden. Finns det ett sätt att tala om för TS att jag vet att objektet jag returnerar är en typ som inte är kompatibel med parametern?