打字稿:0-n参数的打字稿通用类型定义

时间:2018-10-20 05:29:55

标签: typescript generics polymorphism

0-n个参数的Typescript通用类型定义

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 :(得分: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或更高版本。

答案 1 :(得分:0)

仍然不满意自己的回答!

我可以重新定义:

// In tests/x/y/z/example.spec.js
import foo from 'tests/unit/foo.json';

但是首先,我避免使用'[]'括号

第二,实施此操作会遇到很多困难:

 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;
相关问题