[英]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_0
、 param_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.