我刚注意到,这个函数(使用默认参数)不会导致编译错误。
function buildAddress(address1 = 'N/A', address2: string) {
displayAddress( address1 +' '+ address2);
}
但是这个功能(使用可选参数)可以。
function buildAddress(address1?: string, address2: string) {
displayAddress( address1 +' '+ address2);
}
为什么会这样?
我对这种行为感到非常惊讶,这是正常的吗?它有什么好处吗?这是一个功能还是一个bug?答案 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");
我不确定这是设计还是副产品,但在某些情况下它很有用。