typcript: определение общего типа Typescript для 0-n параметров - PullRequest
0 голосов
/ 20 октября 2018

Typescript Определение универсального типа для 0-n параметров

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();

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Все еще не удовлетворяю ответ от себя!

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

 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)
0 голосов
/ 20 октября 2018

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

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 или выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...