TypeScript中的多个可选参数

12

假设我有一个如下的函数

function addressCombo(street1:string, street2:string = "NA", street3?:string) {
    console.log("street1: " + street1);
    console.log("street1: " + street2);
    console.log("street2: " + street3);
}

如果我想传递参数street1street3的值,但不包括street2,那我该怎么做呢?

我来自C#背景,在那里我们会这样做:

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

1
我希望它更像C#一样工作,这似乎很奇怪,你可以使一个函数拥有可选参数,但你仍然必须为每个可选参数传递未定义的值。 - Brendan Sluke
2个回答

14

这不是一个TypeScript问题,而是一个JavaScript问题。

可选参数必须放在最后,只有当所有后面的参数也都被省略时,才可以将其省略。否则,JavaScript将不知道你为哪个参数传递了一个值。

考虑你示例中的第二个参数是可选的。在调用中,你只需要省略它而不传递任何值。

function addressCombo(street1, street2, street3) {}

addressCombo("LA", "LO")

然而,JavaScript 不知道你打算将 "LO" 用作 street3 的参数,而不是 street2 的参数。相反,它会按行分配它们。

换句话说,在省略了 street2 参数之后,你不能为 street3 提供参数。

你可以明确地传递 undefined 给可选参数,这与如果省略参数一样。在你的示例中,这将是:

addressCombo("LA", undefined, "LO")

请参见:

如何在 JavaScript 函数中跳过参数

JavaScript 函数中的可选第一个参数

如何在省略某些可选参数的同时传递可选参数


1
对我来说,这两个答案都可以,但我认为被接受的那一个更加灵活。如果此类参数的数量增加,传递“undefined”将变得困难且有点丑陋。不过还是给你点赞。 - Imad

9
您可以使用对象来传递参数(或类似 streets: { [key: string]: string } 的东西):
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接