【问题标题】:How can I check whether an optional parameter was provided?如何检查是否提供了可选参数?
【发布时间】:2020-07-17 18:57:25
【问题描述】:

给定一个带有可选参数的函数:

function DoSomething(a, b?) {
    /** Implementation */
}

如何确定函数体内是否提供了可选参数?目前,我能想到的最好的方法是:

typeof b === 'undefined'

但这有点凌乱,不直接阅读。由于 TypeScript 提供了可选参数支持,我希望它也有一种直观的方式来检查是否提供了参数。

如上例所示,我不介意可选参数是显式设置为undefined 还是根本不提供。

编辑

很遗憾,这个问题并没有应有的清晰,尤其是在略读的情况下。它的目的是关于如何干净地检查可选参数是否完全省略,如:

DoSomething("some value");

我接受了 Evan 的回答,因为他的解决方案 (b === undefined) 比我的问题 (typeof b === 'undefined') 中的解决方案更干净,同时仍然具有相同的行为。

其他答案肯定有用,哪个答案对你来说是正确的取决于你的用例。

【问题讨论】:

  • 取决于您要检查的内容,有人可能会调用您的方法foo(1, undefined)。您可以查看arguments.length
  • @EvanTrimboli,谢谢;我觉得你是对的。我已经更新了问题以澄清这两种可能性都是可以接受的。
  • 我投票结束这个问题,因为它不清楚,因为它已经完成了它的过程,最终根据它的解释方式有多个“正确”的答案。

标签: typescript


【解决方案1】:

在谷歌搜索“typescript check for undefined”后,我在结果顶部看到了这个问题,但 Evan Trimboli 给出的答案并没有解决我的问题。

这是最终解决了我的问题的answer。以下代码是我确定的。它应该在值等于nullundefined 的情况下工作:

function DoSomething(a, b?) {
    if (b == null) doSomething();
}

【讨论】:

  • 我想知道这个。 github.com/Microsoft/TypeScript/wiki/… 说“不要使用 null”。 basarat.gitbooks.io/typescript/content/docs/tips/null.html 说“空值不好”。我很想了解更多关于使用null 而不是undefined 的潜在陷阱。
  • 上面写着“注意:这些是 TypeScript 贡献者的编码指南。”
  • 如果要检查是否已设置,检查if (b != null) doSomethingWith(b);是否安全?
  • nullundefined 是不同的值。在这个例子中DoSomething('smth', null) 我们确实提供了可选参数并且doSomething() 将被执行。如果未传递可选参数,则为undefined
  • @TheJKFever yes if (b != null) ... 也可以。
【解决方案2】:

您可以检查该值是否未定义:

var fn = function(a) {
    console.log(a === undefined);
};
    
fn();          // true
fn(undefined); // true
fn(null);      // false
fn('foo');     // false

【讨论】:

  • 是的,这通常似乎与我的示例解决方案的工作方式相同。但是,由于这是一个普遍的问题,我认为改用typeof 检查会更安全。
  • 我不太明白你所说的“一般”问题是什么意思。通常,您想使用typeof 的唯一时间是未定义变量。例如typeof somevar === 'undefined'.
  • 所谓“一般性问题”,我的意思是这个问题并没有真正提供任何上下文,所以我认为答案最好也适用于所有上下文。
  • 我认为typeof检查更安全的原因是undefined可以在某些浏览器中重新定义(有意或无意地)。
  • 不幸的是,我最初的问题已被解释为几种不同的方式。我的意图实际上是让一个可选参数不存在,就像这个答案中的fn(1) 一样。在 TypeScript 和 JavaScript 中,值都是 undefined,因此 Evan 的回答最接近标记,也表明他阅读了问题背后的意图。所以我将此答案标记为已接受。
【解决方案3】:

TypeScript 的 util 模块具有函数 isUndefined()。你可以这样使用它。

import {isUndefined} from "util";

class A {
    test(b?: string): string {
        if (isUndefined(b)) {
            return "UNDEFINED";
        } else {
            return ("DEFINED" + b);
        }
    }
}

【讨论】:

  • isUndefined util 函数自 v4 以来已被弃用。请改用value === undefined
  • 你是对的。不推荐使用它们(util.is* 函数)的原因是存在一些问题,修复它们会导致大量代码损坏。他们决定弃用。我刚刚创建了自己的 utils 模块并定义了这些函数。
  • 附带说明:根据 index.d.ts,isUndefined 自 v4.0.0 起已弃用
【解决方案4】:

你可以像这样简单地添加一个带有默认值的可选参数

function DoSomething(a, b: boolean=null) {
    if(b == null)
    {
      //parameter was not set
    }
    else
    {
    //parameter is true or false...no other option available
    }
}

【讨论】:

    【解决方案5】:

    来自here 没有问题:

    function getSchool(name: string, address?: string, pinCode?: string): string {
        if (typeof address === 'undefined') {
            console.log('address not defined');
        }
        if (typeof pinCode === 'undefined') {
            console.log('pincode not defined');
        }
        //...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 2020-10-09
      • 2018-07-28
      • 2012-01-25
      • 2015-06-20
      • 1970-01-01
      • 2013-01-22
      相关资源
      最近更新 更多