11

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

可选参数

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


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

4

7 回答 7

9

编辑:如果你要使用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");
};
于 2013-09-11T18:21:46.880 回答
8

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

于 2013-09-11T18:31:05.920 回答
7
function foo(value1, value2){
/**
* @param myParam1 [Required]
* @param myParam2
*/
  if(value1 == undefined){
    throw('Value1 is a required field for function foo');
  }
}
于 2013-09-11T18:13:51.623 回答
6

使用 ES6 default function parameters,您可以实现一个RequiredFLAG,当调用具有所需参数的函数而不提供它们时,该 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

于 2019-02-17T14:43:03.367 回答
6

我有另一个想法。我在一些文章上找到了这个。

创建一个名为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));

于 2020-02-13T08:07:37.717 回答
0
function mandatory(params) {
    for (const [key, value] of Object.entries(params)) {
        if (!value) {
            throw Error(`Mandatory param error: ${key} can't be null`);
        }
    }
}

用法:

functionThatRequiresParams = (paramA, param2) => {
    mandatory({paramA, param2});
    console.log('a ok');
}
于 2022-03-01T12:28:23.027 回答
0
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');
于 2021-11-30T15:26:57.423 回答