Nested Parenthetical Madness

    TypeScript icon, indicating that this package has built-in type declarations

    1.0.4 • Public • Published


    NPM version NPM downloads

    GitHub NodeJS Codecov

    Visual Studio Code

    Unpartial a type.

    It is very common to define a config type and Partial<> it in a function argument. When we received the argument, we want to merge it with our default config before using it:

    import { unpartial } from 'unpartial'
    interface Config {
      require: { a: number }
      optional?: { a: number }
    const defaultConfig: Config = { require: { a: 1 } }
    function foo(givenConfig?: Partial<Config>) {
      const config = unpartial(defaultConfig, givenConfig);
      // use config with type safety

    Code completion is available as you type:

    const config = unpartial(defaultConfig, { /* code completion here */});

    It also supports merging two default configs. This is useful when you are extending the interface from another package/class.

    import { unpartial } from 'unpartial'
    import { Option, defaultOption } from 'another-package'
    interface MyOption extends Option { ... }
    const myDefaultOption = { ... }
    function foo(givenOption?: Partial<MyOption>) {
      const option = unpartial(defaultOption, myDefaultOption, givenOption)

    This is deprecated because currently TypeScript does not support optional generic type, so it is not possible to create a satisfactory signature that works with both implicit and explicit type.

    Instead, please use composition when combining 3 or more values:

    unpartial(unpartial(defaultOption, myDefaultOption), givenOption)

    There are 3 more functions available in this library:

    • unpartialRecursively(): unpartial() deeply.
      In practice, this does not seem to be useful. Maybe will be deprecated and removed in the future.
    • required(): an alternative version of unpartial() with a different type management.
      This will become identical to unpartial() in the future.
    • requiredDeep(): an alternative version of unpartialRecursively() with a different type management.
      This will become identical to unpartial() in the future.

    unpartial is also exposed through type-plus. It contains many more functions and type utilities.

    Feel free to check it out.


    # after fork and clone
    pnpm install
    # begin making changes
    git checkout -b <branch>
    pnpm watch
    # after making change(s)
    git commit -m "<commit message>"
    git push
    # create PR




    npm i unpartial

    DownloadsWeekly Downloads






    Unpacked Size

    32 kB

    Total Files


    Last publish


    • unional