【问题标题】:Why does typescript allow default parameters before required parameters?为什么打字稿允许在必需参数之前使用默认参数?
【发布时间】:2016-07-21 14:52:52
【问题描述】:

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

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

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

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

为什么会这样?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,我知道,但我对这种行为感到非常惊讶,这正常吗?它有什么好处吗?这是功能还是错误?
    • 我不知道这是否是一个错误,但我用一个有用的例子编辑了我的答案。您可以提交错误报告并查看他们如何响应。如果你愿意,我想继续这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2016-04-14
    • 2012-02-14
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    相关资源
    最近更新 更多