PokéRogue
    Preparing search index...

    Type Alias ApplyDefaultOptions<Options, Defaults, SpecifiedOptions>

    ApplyDefaultOptions: If<
        IsAny<SpecifiedOptions>,
        Defaults,
        If<
            IsNever<SpecifiedOptions>,
            Defaults,
            Simplify<
                Merge<
                    Defaults,
                    {
                        [Key in keyof SpecifiedOptions as Key extends OptionalKeysOf<
                            Options,
                        >
                            ? undefined extends SpecifiedOptions[Key] ? never : Key
                            : Key]: SpecifiedOptions[Key]
                    },
                > & Required<Options>,
            >,
        >,
    >

    Merges user specified options with default options.

    Type Parameters

    type PathsOptions = {maxRecursionDepth?: number; leavesOnly?: boolean};
    type DefaultPathsOptions = {maxRecursionDepth: 10; leavesOnly: false};
    type SpecifiedOptions = {leavesOnly: true};

    type Result = ApplyDefaultOptions<PathsOptions, DefaultPathsOptions, SpecifiedOptions>;
    //=> {maxRecursionDepth: 10; leavesOnly: true}
    // Complains if default values are not provided for optional options

    type PathsOptions = {maxRecursionDepth?: number; leavesOnly?: boolean};
    type DefaultPathsOptions = {maxRecursionDepth: 10};
    type SpecifiedOptions = {};

    type Result = ApplyDefaultOptions<PathsOptions, DefaultPathsOptions, SpecifiedOptions>;
    // ~~~~~~~~~~~~~~~~~~~
    // Property 'leavesOnly' is missing in type 'DefaultPathsOptions' but required in type '{ maxRecursionDepth: number; leavesOnly: boolean; }'.
    // Complains if an option's default type does not conform to the expected type

    type PathsOptions = {maxRecursionDepth?: number; leavesOnly?: boolean};
    type DefaultPathsOptions = {maxRecursionDepth: 10; leavesOnly: 'no'};
    type SpecifiedOptions = {};

    type Result = ApplyDefaultOptions<PathsOptions, DefaultPathsOptions, SpecifiedOptions>;
    // ~~~~~~~~~~~~~~~~~~~
    // Types of property 'leavesOnly' are incompatible. Type 'string' is not assignable to type 'boolean'.
    // Complains if an option's specified type does not conform to the expected type

    type PathsOptions = {maxRecursionDepth?: number; leavesOnly?: boolean};
    type DefaultPathsOptions = {maxRecursionDepth: 10; leavesOnly: false};
    type SpecifiedOptions = {leavesOnly: 'yes'};

    type Result = ApplyDefaultOptions<PathsOptions, DefaultPathsOptions, SpecifiedOptions>;
    // ~~~~~~~~~~~~~~~~
    // Types of property 'leavesOnly' are incompatible. Type 'string' is not assignable to type 'boolean'.