联合函数类型使具有较少参数的函数具有所有参数类型

时间:2018-07-20 18:58:34

标签: typescript typescript2.0

我似乎已经迷上了这个。我正在尝试创建两个函数的联合类型别名。编译器可以看到函数的所有参数的类型,而其中的参数要少得多。

interface Function1 {
    (param1: boolean, param2: number, param3: string): void;
}

interface Function2 {
    (param0: any, param1: boolean, param2: number, param3: string): void;
}

type FunctionUnion = Function1 | Function2;

const function1implemenattion: FunctionUnion = (param1, param2, param3) => {
    // param1 is any
    // param2 is any
    // param3 is any
}

const function2implementation: FunctionUnion = (param0, param1, param2, param3) => {
    // param0 is any
    // param1 is boolean
    // param2 is number
    // param3 is string
}

我宁愿不执行以下操作:

const function1implemenattion: FunctionUnion = (param1: boolean, param2: number, param3: string) => {

因为那样会抵消我对接口的使用,并使将来更改类型变得更加困难。

如果可以的话,如何在不牺牲方便性或可读性的情况下完成此任务?我想避免这样的签名:

type FunctionUnion = (param0: any, param1: number | boolean, param2: number | string, param3?: string) => void

感谢您抽出宝贵的时间阅读并帮助解决我的问题!

2 个答案:

答案 0 :(得分:0)

您无法完成此操作。但是,您可以像这样创建重载函数。

interface YourFunction {
    (param1: boolean, param2: number, param3: string): void;
    (param0: any, param1: boolean, param2: number, param3: string): void;
}

const func: YourFunction = (p0, p1, p2, p3) => {}

虽然我以前认为重载函数不能解决我的问题,但这正是我想要的。

答案 1 :(得分:0)

您可以使用类型。 像这样:

type Params = {
    parameter1: string | number,
    parameter2: string;
}

function test(...parameters: Params[]) {
    const var1= parameters[0].parameter1
    const var2 = parameters[0].parameter2
    // also you can see length of array size with parameters.length code
}

The snipped