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

Typescript 联合函数类型使参数较少的函数具有所有参数类型,typescript,typescript2.0,Typescript,Typescript2.0,我似乎在这件事上把自己难住了。我正在尝试创建两个函数的联合类型别名。编译器会将参数较少的函数的所有参数的类型视为任何类型 interface Function1 { (param1: boolean, param2: number, param3: string): void; } interface Function2 { (param0: any, param1: boolean, param2: number, param3: string): void; } type

我似乎在这件事上把自己难住了。我正在尝试创建两个函数的联合类型别名。编译器会将参数较少的函数的所有参数的类型视为任何类型

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

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

你不可能做到这一点。但是,您可以像这样创建重载函数

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) => {}
虽然我以前认为重载函数不能解决我的问题,但这正是我想要的。

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

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
}

你为什么想要函数的并集。a.k.a.@jcalz我们正试图实现类似的功能,尽管它们使用上述函数的方式略有不同,因为中间件被接受为参数,而我们的函数是对象上的值,然后作为参数传递。