машинописный: Машинопись Родового определение Типа 0-п параметров

голоса
1

Машинопись Родовой тип определения 0-п параметров

interface F<TOut, T1=any, T2=any, T3=any, T4=any, T5=any> {
   (...args: [T1, T2, T3, T4, T5]): TOut
}

let x1: F<string, number, boolean> = (a: number, flag:boolean) => flag? a+: -;
let x2: F<number, number | undefined> = (a?: number) => a? a: 3;
let x3: F<boolean> = () => true;

Но почему-то я должен назвать их таким образом:

x1(1,true, undefined, undefined, undefined);
x2(3, undefined, undefined, undefined, undefined);
x2(undefined, undefined, undefined, undefined, undefined);
x3(undefined, undefined, undefined, undefined, undefined);

Как я должен изменить определение F <...> так что я мог бы назвать их короче как:

x1(1, true);
x2(3);
x2();
x3();
Задан 20/10/2018 в 05:29
источник пользователем
На других языках...                            


2 ответов

голоса
0

До сих пор не сытный ответ от себя!

Я мог бы пересмотреть с этим:

 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)
Ответил 20/10/2018 в 05:54
источник пользователем

голоса
0

Вы можете использовать тип кортежа вместо того, чтобы представлять типы аргументов. Кортеж может иметь дополнительные компоненты, которые станут необязательными параметрами:

interface F<TOut, T extends any[]> {
  (...args: T): TOut
}

let x1: F<string, [number, boolean]> = (a: number, flag:boolean) => flag? a+"": "-";
let x2: F<number, [number?]> = (a?: number) => a? a: 3;
let x3: F<boolean, []> = () => true;

x1(1, true);
x2(3);
x2();
x3();

Примечание Это решение требует 3,0 или выше.

Ответил 20/10/2018 в 05:49
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more