Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript中的多个可选参数_Typescript - Fatal编程技术网

TypeScript中的多个可选参数

TypeScript中的多个可选参数,typescript,Typescript,假设我有一个如下的函数 function addressCombo(street1:string, street2:string = "NA", street3?:string) { console.log("street1: " + street1); console.log("street1: " + street2); console.log("street2: " + street3); } 我想传递参数street1和street3的值,但不传递street2

假设我有一个如下的函数

function addressCombo(street1:string, street2:string = "NA", street3?:string) {
    console.log("street1: " + street1);
    console.log("street1: " + street2);
    console.log("street2: " + street3);
}
我想传递参数
street1
street3
的值,但不传递
street2
的值,那么我该怎么做呢

我来自
C#
背景,我们的做法如下

addressCombo("ABC", street3 : "XYZ");

这不是一个真正的类型脚本问题,而是一个JavaScript问题

可选参数必须在后面,并且只有在删除所有后面的参数时才能删除。否则JavaScript不知道为哪个参数传递了值

假设示例中的第二个参数是可选的。在一个调用中,您只需省略它,而不传递值

function addressCombo(street1, street2, street3) {}

addressCombo("LA", "LO")
但是,JavaScript不知道您打算将
“LO”
作为
street3
的参数,而不是
street2
的参数。相反,它将在行中分配它们

换言之,在您忽略了
street2
之后,您就不能为
street3
提供参数

您可以显式地将
未定义的
传递给可选参数,如果您遗漏了一个参数,则无论如何都会发生这种情况。在您的示例中,这将是

addressCombo("LA", undefined, "LO")
另请参见


您可以使用对象来传递参数(或类似于
streets:{[key:string]:string}
):


这两个答案对我都适用,但我认为被接受的答案更灵活。如果此类参数的数量增加,则通过
未定义的
将变得困难且有点难看+1尽管如此,我希望它能更像C#一样工作,但让函数有一个可选参数似乎很奇怪,但无论如何,你仍然必须为每个可选参数传递一个未定义的值。
function addressCombo(streets: { street1?: string; street2?: string; street3?: string }) {
  console.log("street1: " + streets.street1);
  console.log("street2: " + streets.street2);
  console.log("street3: " + streets.street3);
}

addressCombo({ street1: 'A', street2: 'B', street3: 'C' });
// Log:
// street1: A
// street2: B
// street3: C

addressCombo({ street1: 'A', street3: 'C' });
// Log:
// street1: A
// street2: undefined
// street3: C