я пытаюсь инкапсулировать некоторую логику внутри компонента OrderGuard (который может работать с двумя типами заказов: CheckinOrder | Checkout order, но, когда я пытаюсь передать заказ обратному вызову orderLoad, машинописный текст начинает жаловаться так
CheckinOrder может быть назначен ограничению типа T, но экземпляр T может быть создан с другим подтипом 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
}
};
я думаю, что что-то упустил, но не могу понять, что я новичок в машинописном тексте, как другие справляются с такими ситуациями?
вызов компонента выглядит так
<OrderGuard<CheckoutOrder>
orderId={orderId}
orderLoaded={!!order}
onOrderLoad={fillOrder}
loadOrder={useOrder}
>
<Checkout startNewSearch={startNewSearch} />
</OrderGuard>
const handleOrderLoad = (order: T) => onOrderLoad(order)
или просто использоватьonOrderLoad
вместоhandleOrderLoad
(что ничего не делает в приведенном выше примере, но делегируетonOrderLoad
) - person Aleksey L.   schedule 14.11.2019OrderGuard
не является общим. Просто объявите его какconst OrderGuard = (props: Props<Order>)
, и, я думаю, все будет в порядке. - person zerkms   schedule 14.11.2019