Function 为什么typescript在需要的参数之前允许默认参数?

Function 为什么typescript在需要的参数之前允许默认参数?,function,typescript,compiler-errors,optional-parameters,default-parameters,Function,Typescript,Compiler Errors,Optional Parameters,Default Parameters,我刚刚注意到,这个函数(使用默认参数)不会导致编译错误 function buildAddress(address1 = 'N/A', address2: string) { displayAddress( address1 +' '+ address2); } 但此函数(使用可选参数)不起作用 为什么会这样 我真的很惊讶这种行为,这正常吗?有什么好处吗?这是一个功能还是一个bug?您是否尝试在不传递第一个参数的情况下使用第一个版本 function buildAddr

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

function buildAddress(address1 = 'N/A', address2: string) {
        displayAddress( address1 +' '+ address2);
    }
但此函数(使用可选参数)不起作用

为什么会这样


我真的很惊讶这种行为,这正常吗?有什么好处吗?这是一个功能还是一个bug?

您是否尝试在不传递第一个参数的情况下使用第一个版本

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);
}
它起作用了

为第一个参数添加默认值仅在通过
未定义的
时有帮助:

buildAddress(undefined, "address2");
当它编译为:

function buildAddress(address1, address2) {
    if (address1 === void 0) { address1 = 'N/A'; }
    console.log(address1, address2);
}
所以在现实中,如果您这样做,那么第一个参数根本不是可选的,您必须传递一个值,并且只有在传递
未定义的
时,您才能获得默认值
但是编译器不会抱怨函数签名,因为第一个参数肯定有值,但是在第二个函数中,因为编译器抱怨第一个参数是可选的


编辑 此behvior可用于防止
未定义的值,例如:

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

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

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

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

是的,我知道,但我真的很惊讶这种行为,这正常吗?有什么好处吗?这是一个特性还是一个bug?我不知道这是不是bug,但我用一个例子编辑了我的答案,说明它是如何有用的。你可以提交一份bug报告,看看他们的反应如何。如果你愿意的话,我想继续
function buildAddress(address1 = 'N/A', address2: string) {
    displayAddress(address1 + ' ' + address2);
}

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

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