function - 为什么 typescript 允许在必需参数之前使用默认参数?

标签 function typescript compiler-errors optional-parameters default-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 时才会获得默认值。
但是编译器不会提示函数签名,因为第一个参数肯定有一个值,但是在你的第二个函数中,因为第一个参数是可选的,所以编译器会提示。


编辑

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

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

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

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

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

关于function - 为什么 typescript 允许在必需参数之前使用默认参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38507550/

相关文章:

c - C语言中如何从指针返回值

javascript - 从代码中的其他地方调用 JQuery 事件作为函数...?

c++ - 逻辑比较运算符

javascript - 将 typescript 缩小为一个 JS 文件,使用 gulp 保持 sourcemaps 工作

visual-studio - 使用.net native 工具链进行编译时,Visual Studio报告System.Reflection.MissingMetadataException

ios - Swift 构建错误 - 没有这样的模块 'Feature1'

Swift自动函数反转

angular - 从组件中的 Assets 目录导入静态 JSON 文件(Angular)

reactjs - 如何保持 TypeScript 类型干燥

haskell - 如何编写map语句来比较haskell中两个列表的每个元素?