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