簡體   English   中英

Typescript function參數

[英]Typescript function parameters

我遇到了一個場景,我有許多具有相似參數的函數,並且努力尋找一種解決方案來使一切都易於維護。 舉個例子:

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){}

行不通

任何想法如何最好地 go 關於這個?

在 function 4,5,6 中,我不能真正擴展它以接受 N 個附加參數而不創建新接口

實際上,您可以使用交集類型來擴展接口“內聯”:

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

您可以使用問號“?” 表示變量是否必要,例如:

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

在此 function 中,您可以傳遞 0、1、2、3 或 4 個參數。

自 TypeScript 3.0 以來,我們已經能夠將function 參數列表表示為元組類型 所以你的用例可以得到這樣的支持:

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
}

好的,希望有幫助。 祝你好運!

鏈接到代碼

好吧,據我所知,您有兩個選擇

第一個:您可以使用函數必須具有的所有參數作為基礎創建一個接口,然后傳遞一個帶有附加屬性的 object。 IE:

interface BaseParams {
  param1: string
  param2: string
}

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

這里的關鍵是不要將參數 object 添加為BaseParams的一部分,然后您可以像這樣創建 function :

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

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

Typescript 將僅評估您傳遞的 object 是否具有您創建的接口中的字段。

另一個不太為人所知的選項是使用 Typescript 中的Partial ,它使您在接口中聲明的所有屬性都是可選的,因此您不必像param1?: string那樣傳遞每個參數。 按照這個順序,您必須創建一個包含所有可能參數的接口。

interface Params {
 param1: string
 param2: string
 param3: string
 param4: string
 paramN: string
}

const funct = (params: Partial<Params>) => {
...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM