1

Consider this function from webpack-merge

smart(...configuration | [...configuration])

It can accept one and only one Configuration[] or ...args: Configuration[] and returns Configuration.

What type does this function have?


UPDATE:

I want to make typings for webpack-merge.

This is what I have so far...

declare module 'webpack-merge' {

  import { Configuration } from 'webpack'

  type StrategyType = 'prepend' | 'append' | 'replace'
  type StrategyMap = { [feild: string]: StrategyType }
  type ConfigurationFolder = (
    conf?: Configuration[], 
    ...args: Configuration[]) => Configuration

  export const merge: ConfigurationFolder
  export const multiple: ConfigurationFolder
  export const smart: ConfigurationFolder

  export const smartStrategy: (options: StrategyMap) => ConfigurationFolder
  export const unique: ConfigurationFolder

  export default merge
}

...but it doesnt work as expected.

Here is the test:

import * as webpackMerge from 'webpack-merge'

const webpackConfig = webpackMerge.smartStrategy({ entry: 'replace' })(
    configs,
    baseConfig 
    # must fail here: only one `Configuration[]` as first param,
    # or only `Configuration, Configuration, Configuration, ....`
  )

UPDATE2

What I want:

class Configuration { }
type Func = (...configuration: Configuration[]) => Configuration;

// usage
const myFunc: Func = (...configuration: Configuration[]) => {
  return new Configuration();
}

const conf = new Configuration;
const confs = [conf];

const r1 = myFunc(confs); // right
const r2 = myFunc(conf); // right
const r3 = myFunc(conf, conf); // right

const f1 = myFunc(confs, confs); // must fail, cause can accept only one array
const f2 = myFunc(conf, confs); // must fail, cause or array, or spread
const f3 = myFunc(confs, conf); // must fail, same

Here is a playable version of what I want.

UPDATE3

spin-off

2
  • Didn't understand. What do you want to do? Commented Aug 27, 2017 at 18:42
  • @PronoyMukherjee Updated Commented Aug 27, 2017 at 18:49

1 Answer 1

3

We can use function overloading to describe a function that...

can accept one and only one Configuration[] or ...args: Configuration[] and returns Configuration

Here is the declaration.

declare function smart(...configuration: Configuration[]): Configuration;
declare function smart(configuration: Configuration[]): Configuration;

Here is an example of its usage.

// in the module's *.d.ts declaration file...

declare class Configuration { 
  public context: any;
  public entry: any;
  public output: any;
}

declare function myFunc(...configuration: Configuration[]): Configuration;
declare function myFunc(configuration: Configuration[]): Configuration;

// in the module consumer's *.ts file...

const conf = new Configuration();
const confs = [conf];

const r1 = myFunc(confs); // right
const r2 = myFunc(conf); // right
const r3 = myFunc(conf, conf); // right

const f1 = myFunc(confs, confs); // must fail, cause can accept only one array
const f2 = myFunc(conf, confs); // must fail, cause or array, or spread
const f3 = myFunc(confs, conf); // must fail, same
Sign up to request clarification or add additional context in comments.

6 Comments

@bjornmelgaard It's hard to understand, because the actual signature of the merge.smart function accepts an object: github.com/survivejs/webpack-merge/blob/…
no, it accepts (...configuration | [...configuration]) npmjs.com/package/webpack-merge#smart-merging
@bjornmelgaard Thank you for clarifying. Does the update to the answer work for you?
@bjornmelgaard I think function overloading my work for your situation.
mmm, looks awesome, can you show how to make function body, look UPDATE3
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.