TypeScript:使函数参数有条件可选



我希望函数只有在满足某些条件时才接受第二个参数。

let fn  = <T extends boolean>(arg1: T, arg2: T extends true ? void : string) => {};
fn(true); // ERROR Expected 2 arguments, but got 1
fn(true, undefined); // OK
fn(false, ''); // OK

这是一种奇怪的行为,尤其是因为将函数参数类型为void不会强制在调用中传入。例如:

let fn1 = (arg: void) => {};
fn1(); // OK

游乐场

这是一个设计限制,请参阅microsoft/TypeScript#29131。在microsoft/TypeScript#27522中实现了将尾随的void函数参数视为可选参数的处理,但对该参数的检查很肤浅,在条件类型中不起作用。

我认为您最好在rest参数位置使用元组来获得您想要的行为,因为元组可以有可选元素,甚至参数名称标签。也许是这样的:

let fn = <T extends boolean>(
arg1: T,
...rest: (T extends true ? [arg2?: undefined] : [arg2: string])
) => { };
fn(true); // okay
fn(true, undefined); // okay
fn(true, ''); // error
fn(false); // error
fn(false, undefined); // error
fn(false, ''); // okay

游乐场链接到代码

最新更新