我遇到的情况是,我有许多功能具有相似的参数,并且努力寻找一种解决方案以使所有内容易于维护。请看以下示例:
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){}
行不通
任何想法如何最好地做到这一点?
答案 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_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
}
好的,希望能有所帮助。祝你好运!
答案 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