Я хочу иметь функцию, которая принимает второй аргумент только при выполнении некоторых условий.
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