为什么打字稿允许在必需参数之前使用默认参数?

Why does typescript allow default parameters before required parameters?

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

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

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

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

为什么会这样?

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

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

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

buildAddress("address2");

结果:

Supplied parameters do not match any signature of call target

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

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.[=39 你只会得到默认值=] 但是编译器不会抱怨函数签名,因为第一个参数肯定有一个值,但是在你的第二个函数中,因为第一个参数是可选的,所以编译器会抱怨。


编辑

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

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

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

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

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