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