在有很多参数的情况下,最好让用户只插入几个参数,而且没有特定的顺序。
例如,不好的做法:
foo(a?, b=1, c=99, d=88, e?)
foo(null, null, null, 3)
因为你必须在你真正想要的参数(d)之前提供所有参数。
好的做法是:
foo({d=3})
实现它的方法是通过接口。
你需要将参数定义为一个接口,像这样:
interface Arguments {
a?;
b?;
c?;
d?;
e?;
}
并像这样定义函数:
foo(arguments: Arguments)
现在接口变量不能得到默认值,那么我们如何定义默认值呢?
简单,我们为整个接口定义默认值:
foo({
a,
b=1,
c=99,
d=88,
e
}: Arguments)
现在如果用户通过:
foo({d=3})
实际参数为:
{
a,
b=1,
c=99,
d=3,
e
}
另一个不声明接口的选项是:
foo({
a=undefined,
b=1,
c=99,
d=88,
e=undefined
})
跟进:
在前面的函数定义中,我们为参数对象的字段定义了默认值,但没有为对象本身定义默认值。
因此,我们将从下面的调用中得到一个提取错误(例如不能读取未定义的属性'b'):
foo()
有两种可能的解决方案:
1.
const defaultObject = {a=undefined, b=1, c=99, d=88, e=undefined}
function foo({a=defaultObject.a, b=defaultObject.b, c=defaultObject.c, d=defaultObject.d, e=defaultObject.e} = defaultObject)
function foo(object = {}) {
object = { b=1, c=99, d=88, ...object }
//Continue the function code..
}
跟进:
如果你需要类型和默认值(并且你不想声明一个接口),你可以这样写:
function foo(params: {a?: string, b?: number, c?: number, d?: number, e?: string}) {
params = { b:1, c:99, d:88, ...params }
//Continue the function code..
}