为什么typescript在必需参数之前允许默认参数?

时间:2016-07-21 14:52:52

标签: function typescript compiler-errors optional-parameters default-parameters

我刚注意到,这个函数(使用默认参数)不会导致编译错误。

function buildAddress(address1 = 'N/A', address2: string) {
        displayAddress( address1 +' '+ address2);
    }

但是这个功能(使用可选参数)可以。

function buildAddress(address1?: string, address2: string) {
        displayAddress( address1 +' '+ address2);
    }

为什么会这样?

我对这种行为感到非常惊讶,这是正常的吗?它有什么好处吗?这是一个功能还是一个bug?

1 个答案:

答案 0 :(得分:4)

您是否尝试过使用第一个版本而不传递第一个参数?

function buildAddress(address1: string = 'N/A', address2: string) {
    console.log(address1, address2);
}

buildAddress("address2");

结果:

  

提供的参数与呼叫目标的任何签名

都不匹配

如果您将第二个参数的默认值设为:

function buildAddress(address1: string , address2: string = 'N/A') {
    console.log(address1, address2);
}

有效。

添加第一个参数的默认值只会帮助您传递undefined

buildAddress(undefined, "address2");

编译为:

function buildAddress(address1, address2) {
    if (address1 === void 0) { address1 = 'N/A'; }
    console.log(address1, address2);
}

所以实际上如果您正在执行此操作,那么第一个参数根本不可选,您必须传递一个值,并且只有通过undefined才能获得默认值。<登记/> 但编译器不会抱怨函数签名,因为第一个参数的值肯定,但在第二个函数中,因为第一个参数是可选的,编译器会抱怨。

修改

此行为可用于安全防范undefined值,例如:

function buildAddress(address1 = 'N/A', address2: string) {
    displayAddress(address1 + ' ' + address2);
}

function getAddress1(): string {
    // logic here, might return undefined
}

buildAddress(getAddress1(), "address 2");

我不确定这是设计还是副产品,但在某些情况下它很有用。