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?