Все еще не удовлетворяю ответ от себя!
Я мог бы переопределить это:
interface G<TOut, T extends any[]> {
(...args: T): TOut
}
let x1: G<string, [number, boolean]> = (a: number, flag:boolean) => flag? a+"": "-";
let x2: G<number, [number] | []> = (a?: number) => a? a: 3;
let x3: G<boolean, []> = () => true;
x1(1, true);
x2(3);
x2();
x3();
Но сначала я избегаю использования скобок '[]'
Во-вторых, при реализации этого будет много трудностей:
(a: number, b?: string, c?: string[], d?: boolean) => a;
Поскольку мне нужно определить:
let x4: G<number, [number, string, string[],boolean] | [number, string, string[]] | [number, string] | [number]> = (a: number, b?: string, c?: string[], d?: boolean) => a;
, чтобы сделать вызов:
x4(3,"-",[], false);
x4(3,"-",[]);
x4(3,"-");
x4(3)