UNPKG

react-router-last-location

Version:

Provides access to the last location in react + react-router (v4.x) apps. Useful for handling internal routing. Easily prevent leaving your app by users.

89 lines (82 loc) 2.64 kB
/** * Types below are taken from utility-types package. * People who doesn't use TypeScript shouldn't be warned about missing `peerDependencies`. * This is the main reason why I didn't want to put utility-types into `peerDependencies`. * @source https://github.com/piotrwitek/utility-types */ /** * Assign * @desc From `U` assign properties to `T` (just like object assign) * @example * type Props = { name: string; age: number; visible: boolean }; * type NewProps = { age: string; other: string }; * * // Expect: { name: string; age: number; visible: boolean; other: string; } * type ExtendedProps = Assign<Props, NewProps>; */ export type Assign< T extends object, U extends object, I = Diff<T, U> & Intersection<U, T> & Diff<U, T> > = Pick<I, keyof I>; /** * Intersection * @desc From `T` pick properties that exist in `U` * @example * type Props = { name: string; age: number; visible: boolean }; * type DefaultProps = { age: number }; * * // Expect: { age: number; } * type DuplicateProps = Intersection<Props, DefaultProps>; */ export type Intersection<T extends object, U extends object> = Pick< T, Extract<keyof T, keyof U> & Extract<keyof U, keyof T> >; /** * Diff * @desc From `T` remove properties that exist in `U` * @example * type Props = { name: string; age: number; visible: boolean }; * type DefaultProps = { age: number }; * * // Expect: { name: string; visible: boolean; } * type DiffProps = Diff<Props, DefaultProps>; */ export type Diff<T extends object, U extends object> = Pick< T, SetDifference<keyof T, keyof U> >; /** * Subtract * @desc From `T` remove properties that exist in `T1` (`T1` is a subtype of `T`) * @example * type Props = { name: string; age: number; visible: boolean }; * type DefaultProps = { age: number }; * * // Expect: { name: string; visible: boolean; } * type RestProps = Subtract<Props, DefaultProps>; */ export type Subtract<T extends T1, T1 extends object> = Pick< T, SetComplement<keyof T, keyof T1> >; /** * SetDifference (same as Exclude) * @desc Set difference of given union types `A` and `B` * @example * // Expect: "1" * SetDifference<'1' | '2' | '3', '2' | '3' | '4'>; * * // Expect: string | number * SetDifference<string | number | (() => void), Function>; */ export type SetDifference<A, B> = A extends B ? never : A; /** * SetComplement * @desc Set complement of given union types `A` and (it's subset) `A1` * @example * // Expect: "1" * SetComplement<'1' | '2' | '3', '2' | '3'>; */ export type SetComplement<A, A1 extends A> = SetDifference<A, A1>;