设置功能参数的类型?

dmr*_*dmr 133 javascript function

有没有办法让javascript函数知道某个参数属于某种类型?

能够做这样的事情是完美的:

function myFunction(Date myDate, String myString)
{
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

更新:由于答案是响亮的"不",如果我想myDate被视为日期(为了在其上调用日期函数),我必须将其作为日期在函数内部或者设置一个新的变量输入日期吗?

pro*_*vit 146

不,JavaScript不是静态类型语言.有时您可能需要手动检查函数体中的参数类型.

  • 祝福和诅咒. (145认同)
  • @JeffreySweeney既不是PHP静态类型.但你可以选择在php中进行类型提示.你有没有看过_big_ nodejs后端应用程序?确切地说,每个函数都有参数,你不知道每个参数是什么.我们正在谈论成千上万的论点,在阅读时,你必须阅读整个代码,以及调用者及其调用者的整个代码等等.祝福?你当然必须开玩笑. (28认同)
  • @JeffreySweeney这不是祝福.这是癌症. (15认同)
  • 除了抨击没有功能允许类型暗示祝福的人我可能想指出打字稿:http://www.typescriptlang.org/基本上EM6 +类型提示 (11认同)
  • @Toskan 我不会说这不是一种祝福。我已经使用 JavaScript 四年了,这就是某些语言的特性。编程语言集_应该_从弱类型到强类型的范围与从低级到高级的范围相同。此外,JavaScript 提供了 `instanceof` 和 `typeof` 关键字来帮助实现这一点。尽管这会占用更多代码,但也许开发人员选择 JavaScript 作为主要依赖于类型的语言的语言。至于庞大的nodejs后端应用程序?我觉得应该是常识。 (2认同)

eol*_*son 71

不是javascript它自己但使用Google Closure Compiler的高级模式你可以这样做:

/**
 * @param {Date} myDate The date
 * @param {string} myString The string
 */
function myFunction(myDate, myString)
{
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

请参阅http://code.google.com/closure/compiler/docs/js-for-compiler.html

  • 我知道这个问题有多老了,但我想指出它在 IntelliJ 中受到尊重。这里的答案非常低估。 (4认同)
  • 也用于 VSCode。 (3认同)

Dan*_*scu 55

虽然您无法通知JavaScript 有关类型的语言,但您可以向IDE通知它们,以便您获得更多有用的自动完成功能.为此,请通过在以下参数中指定参数之前的类型来使用类型提示@param:

在此输入图像描述

这是一种非常普遍的技术,例如ReactJS使用技术.对于传递给第三方库的回调参数非常方便.

  • 如何在"VSCode"上获得这个? (8认同)
  • 谢谢。尽管这取决于 IDE。我用的是VI,不能用。 (3认同)
  • @negrotico19:“vi”是一个被过度滥用的编辑器,而不是 IDE。您可以在“vi”中做很多事情,就像您可以在 Excel 中制作音乐视频一样。(https://www.wired.com/2012/08/stop-motion-excel-music-video/)。好主意?可能不会。使用适合工作的正确工具。 (2认同)
  • @AnandUndavia 对于 VSCode,您可以使用选项 1,但据我所知,只能使用 [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) 扩展。顺便说一句,很抱歉(非常)迟到的答复。 (2认同)

Ren*_*aud 21

从Facebook 查看新的Flow库,"一个静态类型检查器,旨在查找JavaScript程序中的类型错误"

定义:

/* @flow */
function foo(x: string, y: number): string {
  return x.length * y;
}
foo('Hello', 42);
Run Code Online (Sandbox Code Playgroud)

类型检查:

$> flow
hello.js:3:10,21: number
This type is incompatible with
  hello.js:2:37,42: string
Run Code Online (Sandbox Code Playgroud)

以下是如何运行它.


VNO*_*VNO 12

不,相反,你需要根据自己的需要做这样的事情:

function myFunction(myDate, myString) {
  if(arguments.length > 1 && typeof(Date.parse(myDate)) == "number" && typeof(myString) == "string") {
    //Code here
  }
}
Run Code Online (Sandbox Code Playgroud)


col*_*lxi 10

您可以使用函数中的包装器实现一个自动处理类型检查的系统.

使用这种方法,您可以构建一个完整的declarative type check system,以便为您管理类型检查.如果您有兴趣更深入地了解这个概念,请查看Functyped库

以下实现以简单但有效的方式说明了主要思想:

/*
 * checkType() : Test the type of the value. If succeds return true, 
 * if fails, throw an Error
 */
function checkType(value,type, i){
  // perform the appropiate test to the passed 
  // value according to the provided type
  switch(type){
    case Boolean : 
      if(typeof value === 'boolean') return true;
      break;
    case String : 
      if(typeof value === 'string') return true;
      break;
    case Number : 
      if(typeof value === 'number') return true;
      break;
    default :
      throw new Error(`TypeError : Unknown type provided in argument ${i+1}`);
  }
  // test didn't succeed , throw error
  throw new Error(`TypeError : Expecting a ${type.name} in argument ${i+1}`);
}


/*
 * typedFunction() : Constructor that returns a wrapper
 * to handle each function call, performing automatic 
 * arguments type checking
 */
function typedFunction( parameterTypes, func ){
  // types definitions and function parameters 
  // count must match
  if(parameterTypes.length !== func.length) throw new Error(`Function has ${func.length} arguments, but type definition has ${parameterTypes.length}`);
  // return the wrapper...
  return function(...args){
    // provided arguments count must match types
    // definitions count
    if(parameterTypes.length !== args.length) throw new Error(`Function expects ${func.length} arguments, instead ${args.length} found.`);
    // iterate each argument value, and perform a
    // type check against it, using the type definitions
    // provided in the construction stage
    for(let i=0; i<args.length;i++) checkType( args[i], parameterTypes[i] , i)
    // if no error has been thrown, type check succeed
    // execute function!
    return func(...args);
  }
}

// Play time! 
// Declare a function that expects 2 Numbers
let myFunc = typedFunction( [ Number, Number ],  (a,b)=>{
  return a+b;
});

// call the function, with an invalid second argument
myFunc(123, '456')
// ERROR! Uncaught Error: TypeError : Expecting a Number in argument 2
Run Code Online (Sandbox Code Playgroud)


und*_*ned 9

它不是内置于语言中,但您可以很容易地自己完成.Vibhu的答案是我认为Javascript中典型的类型检查方式.如果你想要更通用的东西,尝试这样的事情:(只是一个让你入门的例子)

typedFunction = function(paramsList, f){
    //optionally, ensure that typedFunction is being called properly  -- here's a start:
    if (!(paramsList instanceof Array)) throw Error('invalid argument: paramsList must be an array');

    //the type-checked function
    return function(){
        for(var i=0,p,arg;p=paramsList[i],arg=arguments[i],i<paramsList.length; i++){
            if (typeof p === 'string'){
                if (typeof arg !== p) throw new Error('expected type ' + p + ', got ' + typeof arg);
            }
            else { //function
                if (!(arg instanceof p)) throw new Error('expected type ' + String(p).replace(/\s*\{.*/, '') + ', got ' + typeof arg);
            }
        }
        //type checking passed; call the function itself
        return f.apply(this, arguments);
    }
}

//usage:
var ds = typedFunction([Date, 'string'], function(d, s){
    console.log(d.toDateString(), s.substr(0));
});

ds('notadate', 'test');
//Error: expected type function Date(), got string
ds();
//Error: expected type function Date(), got undefined
ds(new Date(), 42);
//Error: expected type string, got number
ds(new Date(), 'success');
//Fri Jun 14 2013 success
Run Code Online (Sandbox Code Playgroud)


xgq*_*rms 6

TypeScript 是目前最好的解决方案之一

TypeScript 通过向语言添加类型来扩展 JavaScript。

https://www.typescriptlang.org/


zVi*_*tor 5

可以使用ArgueJS轻松实现

function myFunction ()
{
  arguments = __({myDate: Date, myString: String});
  // do stuff
};
Run Code Online (Sandbox Code Playgroud)

  • 看起来像一个很棒的图书馆。恭喜。 (2认同)