【问题标题】:How do I make my own JavaScript functions have required parameters?如何使我自己的 JavaScript 函数具有必需的参数?
【发布时间】:2013-09-15 21:32:59
【问题描述】:

当我在 intellij idea 中编写 javascript 时,我可以检查我正在调用的函数的参数,它会说类似

我不确定这是否是它了解标准库的 intellij 功能,或者它是否是允许您将参数标记为可选/必需的 javascript 功能。无论哪种方式,我都想了解如何使用可选/必需参数创建自己的函数。我所知道的是 optional 似乎是默认值,因为 Intellij 说我的所有函数参数都是可选的。


从我看到的答案来看,这听起来像是一个 Intellij 功能。但是,现在我想知道 Intellij 是否为我提供了一种将我自己的函数参数标记为可选/必需的方法。

【问题讨论】:

    标签: javascript intellij-idea coffeescript


    【解决方案1】:
    const isRequired = () => { throw new Error('param is required'); };
    
    const hello = (name = isRequired()) => { console.log(`hello ${name}`) };
    
    // These will throw errors
    hello();
    hello(undefined);
    
    // These will not
    hello(null);
    hello('David');
    

    【讨论】:

      【解决方案2】:

      我有另一个想法。我在某篇文章中发现了这一点。

      创建一个名为required()的函数;

      function required(varName) {
          throw new Error(`${varName} is required. `);
      }
      

      当需要一个参数时,只需这样使用:

      fnName(a=required("a"), b = required("b")){
          ....
          ...
      }
      

      代码示例:

      function required(varName) {
          throw new Error(`${varName} is required. `);
      }
      
      function sumOfTwoValues(a= required("a"), b = required("b")){
         return a+b
      }
      
      console.log("sumOfTwoValues(1,2): ", sumOfTwoValues(1,2));
      console.log("sumOfTwoValues(1): ", sumOfTwoValues(1));

      【讨论】:

        【解决方案3】:

        使用 ES6 default function parameters,你可以实现一个Required FLAG,当一个带有所需参数的函数在没有提供参数的情况下被调用时,它会抛出错误并停止执行。

        // set a getter to a custom global identifier (P_REQUIRED)
        Object.defineProperty( window , 'P_REQUIRED'  , {
          get : ()=>{
            let err     = new Error('');
            let trace   = err.stack.split('\n');
            let msg     = '';
            for(let i=2;i<trace.length;i++)  msg+=trace[i]+'\n';
            throw 'Error : Missing required parameter\n' + msg; 
          },
          configurable : false
        });
        
        
        // declare a function with a mandatory parameter
        function myFunc( myParam = P_REQUIRED ){
          /* some code here */
        }
        
        // call the function without the parameters
        myFunc();
          
        // Error is thrown!

        本质上,P_REQUIRED 由解释器分配给参数,当函数调用中没有指定值时。这会触发 getter 处理程序,它只是准备并抛出一个新的错误。

        这是一个干净的跨浏览器解决方案,可以在任何现代环境中运行(需要 ES6)。

        我实际上将它打包为一个 javascript 模块。
        +信息:https://github.com/colxi/P_REQUIRED

        【讨论】:

        • 这应该是答案
        【解决方案4】:
        function foo(value1, value2){
        /**
        * @param myParam1 [Required]
        * @param myParam2
        */
          if(value1 == undefined){
            throw('Value1 is a required field for function foo');
          }
        }
        

        【讨论】:

        • 您确定 Intellij 会使用此代码告诉我 value1 是必需的吗?
        • 这里的基本思想是在函数内部进行参数验证,以便您可以提供自己的自定义、有目的的反馈,这似乎是解决此问题的标准方法...+1跨度>
        • 如果 undefined 是一个有效值,那么它是一个可选参数。
        • 我认为您对 intellij 的询问是因为这些是本机 javascript 函数。除非有某种用于 intellij 自动完成的评论系统,否则你无法做到。
        • jetbrains.com/idea/webhelp/creating-jsdoc-comments.html 看起来有。但是,您会想要为必填字段添加错误,如图所示,这是一个很好的约定。
        【解决方案5】:

        如果您只关心代码完成位,那么您可以在 IntelliJ 环境中使用 JSDoc comments 来获得它。这不会影响您的代码,正如其他人指出的那样,您无法向 JavaScript 解释器指定参数是否是可选的,但编辑器将从注释中获取信息并在您键入时显示它。这样,您自己的函数的显示方式与库函数类似。

        【讨论】:

        • 在 jsdoc 中,@param {string} [somebody] 是可选参数,而 @param {string} somebody 是必需的 - 搜索 usejsdoc.org/tags-param.html 以查找“可选参数”
        【解决方案6】:

        编辑:如果您要使用 TypeScript 之类的东西,您可以进行这种检查。

        如果不对预期的参数进行逐字检查(正如 VoronoiPotato 已经展示的那样),这在 JavaScript 中是不可能做到的。

        每个 JavaScript 函数都可以访问 arguments 变量。您可以检查其中是否有任何参数,以及它们是否属于您所期望的类型。

        var foo = func(a, b) {
        
          if(arguments.length < 2 )
             Throw("error");
        
          if(typeof a !== '<expectedtype>' && typeof b !== '<expectedtype>')
             Throw("error");
        };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-09
          • 1970-01-01
          • 2016-11-29
          • 1970-01-01
          • 1970-01-01
          • 2014-03-24
          相关资源
          最近更新 更多