TypeScript 中的多个可选参数 [重复]

Posted

技术标签:

【中文标题】TypeScript 中的多个可选参数 [重复]【英文标题】:Multiple optional parameters in TypeScript [duplicate] 【发布时间】:2020-07-09 19:29:42 【问题描述】:

假设我有如下函数

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");

【问题讨论】:

我希望它更像 C#,虽然你可以让一个函数有一个可选参数但你仍然必须为每个可选参数传递一个未定义的值,这似乎很奇怪。 【参考方案1】:

这不是一个真正的 TypeScript 问题,而是一个 javascript 问题。

可选参数必须在后面,并且只有在所有后面的参数都被省略的情况下才能被省略。否则 JavaScript 不知道您为哪个参数传递了值。

请考虑示例中的第二个参数是可选的。在通话中,您只需将其忽略而不传递值。

function addressCombo(street1, street2, street3) 

addressCombo("LA", "LO")

但是,JavaScript 并不知道您打算将 "LO" 用作 street3 而不是 street2 的参数。相反,它将在行中分配它们。

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

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

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

另请参阅

Skip arguments in a JavaScript function

javascript: optional first argument in function

How to pass optional parameters while omitting some other optional parameters?

【讨论】:

两个答案都对我有用,但我认为接受的答案更灵活。如果此类参数的数量增加,通过undefined 将很难而且有点难看。 +1 虽然。【参考方案2】:

您可以使用一个对象来传递您的参数(或类似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

【讨论】:

以上是关于TypeScript 中的多个可选参数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Typescript、接口、类型、多个可选属性、以其他属性为条件的属性

带有可选参数的 TypeScript lambda 函数

基于可选函数参数的不同返回类型 - Typescript

Express中的多个可选路由参数?

Django 2+ 中的多个可选 URL 参数

C#4.0中的方法重载与可选参数[重复]