Prz*_*ert 2 typescript typescript-generics typescript-typings
我希望只有在满足某些条件时才采用第二个参数的函数。
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
Run Code Online (Sandbox Code Playgroud)
这是很奇怪的行为,特别是因为类型函数参数作为 void 不会强制在调用中传递。例如:
let fn1 = (arg: void) => {};
fn1(); // OK
Run Code Online (Sandbox Code Playgroud)
这是设计限制,请参阅microsoft/TypeScript#29131。将尾随函数参数视为可选已在microsoft/TypeScript#27522void中实现,但对此的检查很浅,并且在条件类型中不起作用。
我认为您最好在其余参数位置使用元组来获得您想要的行为,因为元组可以具有可选元素甚至参数名称标签。也许是这样的:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
922 次 |
| 最近记录: |