typescript - Diskriminerade unioner av objekt med gemensamma egenskaper
Bakgrund
Jag har en typ Payload definierad så här:
type Payload =
| {
category: Category.ROUTE_POINT;
id: string;
newValues: Partial<RoutePoint>;
}
| {
category: Category.UNASSIGNED_ROUTE_POINT;
id: string;
newValues: Partial<UnassignedRoutePoint>;
};
Jag har också en funktion som heter ArrayUtils.updateObject definierad så här:
export default class ArrayUtils {
static updateObject = <T>(oldObject: T, newValues: Partial<T>) =>
{
// code omitted
}
Problem
Jag har en reducer som tar emot ett action-objekt som innehåller ett payload av typen Payload. Jag begränsar typen av payload baserat på en kontroll av category, men av någon anledning har min kompilator problem med att skicka action.payload.newValues i min ArrayUtils.updateObject-funktion eftersom den inte är säker på att action.payload.newValues är av typen Partial<RoutePoint>.
Om jag tilldelade action.payload.newValues till någon annan variabel, har kompilatorn inga problem.
Varför är inte min kompilator medveten om att en inskränkning har skett för att lita på att min action.payload.newValues är av rätt typ?
if (action.payload.category !== Category.ROUTE_POINT) return routes;
// action.payload.newValues is already narrowed
// Hovering over action.payload.newValues shows it is of type Partial<RoutePoint>
const newValues = action.payload.newValues;
return routes.map((route) => {
return {
...route,
points: ArrayUtils.updateItemInArray(
route.points,
action.payload.id,
(p) => {
// return ArrayUtils.updateObject(p, action.payload.newValues); does not work
return ArrayUtils.updateObject(p, newValues); // this works
}
),
};
});