【问题标题】:How can I tell Typescript to use the default value when an empty string is provided as function parameter?当提供空字符串作为函数参数时,如何告诉 Typescript 使用默认值?
【发布时间】:2021-11-23 07:10:50
【问题描述】:

在 Typescript 中,当为 string 类型的参数分配默认值时,空字符串会被视为某事并且不使用默认值。

这是有道理的,但在某些情况下,我想改变它:

function greet (name?:string = 'visitor') {
  console.log(`Hello ${name}`)
}
greet('Gromit') // logs "Hello Gromit"
greet() // logs "Hello visitor"
greet('') // logs "Hello " <--- How can I get the default value in this case too?

Typescript 是否可能有一个我没有找到的功能来帮助定义我希望何时应用默认值?

目前,我一直在使用我认为的解决方法:

const defaultName = 'visitor'
function greet (name?:string = defaultName) {
  const finalName = name || defaultName
  console.log(`Hello ${finalName}`)
}

但我宁愿在 Typescript 上使用更简洁、更惯用的东西,如果不存在更好的模式,我会感到惊讶。

明确地说,我希望在负责定义函数参数的代码部分中找到一种方法来执行此操作: 函数问候 (/* 这里 */) {}

建议的解决方案在本节之外引入代码,就像我在解决方法中所做的一样。

感谢您的指点!

【问题讨论】:

    标签: typescript default-value


    【解决方案1】:

    无法在函数参数中定义此条件。我能想到的最简洁的方法就是检查和替换函数体内的值:

    function greet(name?: string) {
      name = name || 'visitor'
      // other code
    }
    

    【讨论】:

    • 这与我的解决方法几乎相同,但在这里我们失去了函数参数本身的默认值,这损害了 Typescript 通常擅长的 IDE 集成以及 self-记录代码的性质……
    • @Shawn What IDE integration are you talking about? 从调用者的角度来看,带有默认参数的函数与带有可选参数的函数之间没有任何区别;两者都显示为(基本上)function greet(name?: string): void
    • 想象一下由此生成文档,文档生成器怎么知道greet2的默认值?
    【解决方案2】:

    不存在更好的模式,因为它会与 "" 覆盖默认非空值的完全合理的行为相冲突。

    您有两种不同的方式来指定类似默认的行为,其中一种是缺少值,另一种是在传递空/假值时提供值。这些可能碰巧产生相同的值,但在函数签名或实现中没有更简洁的模式来表示这一点。

    我对 MaartenDev 和 Vojtěch Strnad 的回答所做的唯一修改是在 JSDoc 中记录默认值,这可能会实现您的 IDE 集成目标。 (不幸的是,即使这样 JSDoc's optional/default value support [name="visitor"] 在 TypeScript Playground 或 VSCode 中也不可见。)

    /**
     * Greets a person.
     *
     * @param [name] Name to greet. "visitor" if falsy or absent.
     */
    function greet(name?: string) {
      name = name || 'visitor'
      // other code
    }
    

    Playground Link

    【讨论】:

    • 另外,我们在这里定义了两次默认值:一次在注释中,一次在函数体中,这使得它们可能不同步……我通常不需要这个因为我通常可以避免使用空字符串调用函数,但是我的 CMS 无法区分空字符串和用户未提供的值……真的很痛苦。
    • @Shawn 我理解与你想要的相比它并不理想的方式,但我希望你理解我认为你想要的东西并不存在的原因。我认为在您的问题、我的回答和 Vojtěch Strnad 的回答之间,您可能会得到最好的答案。
    • 是的,我也开始有这种印象了。我明白,你知道的。我不提倡更改默认值,我只是很惊讶这里似乎是一个常见问题没有额外的功能......我不是在寻找语言最黑暗的角落来发现这里的不完美之处,我'我只是在解决我日常遇到的一个问题,我很惊讶没有人提出解决方案。我期待有关创建可以实现此目的的 NonEmptyString 类型的建议,但实际上我对 Typescript 的期望可能完全是错误的。
    猜你喜欢
    • 2019-08-25
    • 2018-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多