# ApplyDefaultOptions

`type` in `plugins` · v0.6.1

<https://docs.seedcord.org/packages/plugins/0.6.1/types/apply-default-options>

Merges user specified options with default options.

## Examples

```ts
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}
```

```ts
// 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; }'.
```

```ts
// 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'.
```

```ts
// 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'.
```

## Declaration

```ts
type ApplyDefaultOptions<
    Options extends object,
    Defaults extends Simplify<
        Omit<Required<Options>, RequiredKeysOf<Options>> &
            Partial<
                Record<RequiredKeysOf<Options>, never>
            >
    >,
    SpecifiedOptions extends Options
> = 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>
        >
    >
>;
```
