打字稿功能参数

时间:2019-09-27 12:56:52

标签: javascript angular typescript rxjs ngrx

我遇到的情况是,我有许多功能具有相似的参数,并且努力寻找一种解决方案以使所有内容易于维护。请看以下示例:

public func1(param1: string, param2: string, param3: string){}
public func2(param1: string, param2: string, param3: string){}
public func3(param1: string, param2: string, param3: string){}

public func4(param1: string, param2: string, param3: string, param4: string){}
public func5(param1: string, param2: string, param3: string, param4: string){}
public func6(param1: string, param2: string, param3: string, param4: string){}

... Etc

最初,我在考虑一个接口,例如:

interface IMyInterface {
  param1: string;
  param2: string;
  param3: string;
}

并在功能中使用它:

public func1(args: IMyInaterface) {

}

但是在功能4,5,6中,我不能在不创建新接口的情况下将其扩展为接受N个附加参数,并且我不想维护所有派生接口。

func1(...args: string){}

行不通

任何想法如何最好地做到这一点?

4 个答案:

答案 0 :(得分:3)

  

在函数4,5,6中,我不能在不创建新接口的情况下将其扩展为接受N个额外的args

实际上,您可以使用交集类型来扩展“内联”接口:

interface BaseArgs {
    foo:string, 
    bar: number
}

function func1(a: BaseArgs) {}
function func2(a: BaseArgs & {more: boolean}) {}

func1({foo: "aa", bar: 3}) // ok
func2({foo: "aa", bar:3, more: true}) // ok

答案 1 :(得分:1)

您可以使用问号“?”表示是否需要变量,例如:

public func4(param1?: string, param2?: string, param3?: string, param4?: string){}

在此功能中,您可以传递0、1、2、3或4个参数。

答案 2 :(得分:1)

自TypeScript 3.0以来,我们已经能够represent function parameter lists as tuple types。因此,您的用例可以得到以下支持:

type ThreeStrings = [string, string, string];
type FourStrings = [string, string, string, string];

class Blarg {
  public func1(...param: ThreeStrings) {}
  public func2(...param: ThreeStrings) {}
  public func3(...param: ThreeStrings) {}
  //(method) Blarg.func3(param_0: string, param_1: string, param_2: string): void

  public func4(...param: FourStrings) {}
  public func5(...param: FourStrings) {}
  public func6(...param: FourStrings) {}
  // (method) Blarg.func6(param_0: string, param_1: string, param_2: string, param_3: string): void
}

您可以看到IntelliSense将方法显示为具有不同的参数,例如param_0param_1等。


您还可以使IntelliSense通过使用以下符号来跟踪参数名称:

type OtherParams = Parameters<
  (name: string, age: number, likesAsparagus: boolean) => void
>;


class Blarg {
  public func7(...param: OtherParams) {}
  public func8(...param: OtherParams) {}
  public func9(...param: OtherParams) {}
  // (method) Blarg.func9(name: string, age: number, likesAsparagus: boolean): void
}

好的,希望能有所帮助。祝你好运!

Link to code

答案 3 :(得分:0)

好的,据我所知,您有两个选项

第一个:您可以创建一个以函数必须具有的所有参数为基础的接口,然后传递具有附加属性的对象。即:

interface BaseParams {
  param1: string
  param2: string
}

const params = {
  param1 = 'the 3rd'
  param2 = 'is'
  param3 = 'additional'
}

此处的关键是不要将params对象添加为BaseParams的一部分,然后可以创建如下函数:

const funct = (params: BaseParams) => {
...
}

//call it with the object you created
funct(params)

Typescript仅会评估您要传递的对象是否具有您创建的界面中的字段。

另一个选项(鲜为人知)是使用Typescript中的Partial,它使您在接口中声明的所有属性都是可选的,因此您不必像{{1}那样传递每个参数}。按此顺序,您必须创建一个包含所有可能参数的接口。

param1?: string