i'm trying to encapsulate some logic inside component OrderGuard ( which can work with two type of orders: CheckinOrder | Checkout order, but, when i'm try to pass order to orderLoad callback, typescript start complain like so
CheckinOrder is assignable to the constraint of type T but T could be instantiated with a different subtype of constaint 'Order'
type Order = CheckoutOrder | CheckinOrder;
interface Props<T extends Order> {
orderId: string;
orderLoaded: boolean;
onOrderLoad: (order: T) => void;
loadOrder: UseCheckinOrder | UseCheckoutOrder;
children?: React.ReactElement;
}
const isCheckinOrder = (order: Order): order is CheckinOrder => {
return !('servicesFallbackURL' in order);
};
const OrderGuard: <T extends Order>(props: Props<T>) => React.ReactElement<Props<T>> = ({
orderId,
orderLoaded,
onOrderLoad,
loadOrder,
children
}) => {
const [userHasAccess, setUserHasAccess] = useState(true);
const { refetch, loading } = loadOrder(orderId, { skip: true });
const handleOrderLoad = (order: Order) => {
if (isCheckinOrder(order)) {
onOrderLoad(order as CheckinOrder); // <-- error here
} else {
onOrderLoad(order as CheckoutOrder); // <-- and here
}
};
i think i miss something but can't figure out what I'm pretty new in typescript, how others handle this situations?
component call looks like
<OrderGuard<CheckoutOrder>
orderId={orderId}
orderLoaded={!!order}
onOrderLoad={fillOrder}
loadOrder={useOrder}
>
<Checkout startNewSearch={startNewSearch} />
</OrderGuard>