2017-08-27 41 views
1

webpack-merge如何编写函数声明只有一个数组作为第一个参数或元素的扩散

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

考虑这个功能它可以接受一个且只有一个Configuration[]...args: Configuration[]并返回Configuration

这个函数有什么类型?


UPDATE:

我想为的WebPack合并分型。

这是我迄今为止...

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 
} 

...但预期它不工作。

下面是测试:

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

我想要什么:

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

+0

不明白。您想做什么? –

+0

@PronoyMukherjee更新 – bjornmelgaard

回答

3

我们可以使用function overloading来形容......

可以接受一个且只有一个Configuration[]...args: Configuration[]并返回Configuration

这里的功能是声明。

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

这里是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 
+0

哈哈,为什么很难理解我的意思))) – bjornmelgaard

+0

@bjornmelgaard这很难理解,因为'merge.smart'函数的实际签名接受一个对象:https://github.com /survivejs/webpack-merge/blob/6bf19b6eb376774beb8ff70a392a956eb7455da6/src/index.js#L34 –

+0

不,它接受'(...配置| [...配置])'https://www.npmjs.com/package/ webpack-merge#智能合并 – bjornmelgaard

相关问题