设置函数参数的类型?

IT技术 javascript function
2021-03-09 23:04:24

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

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

function myFunction(Date myDate, String myString)
{
    //do stuff
}

谢谢!

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

6个回答

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

可悲的是,@Marvin,开发人员并不总是能像他们希望的那样控制他们使用的语言。例如,如果您想为 Google Sheet 制作一个脚本,它(据我所知)在 Google 结束时必须是 JS。
2021-04-20 23:04:24
@JeffreySweeney 也不是 PHP 静态类型的。但是您可以选择在 php 中进行类型提示。你有没有看过一个大的nodejs 后端应用程序?确切地说,每个函数都有参数,你不知道每个参数是什么。我们正在谈论成千上万的参数,在阅读时,您必须阅读整个代码,以及调用者及其调用者的整个代码等。祝福?你肯定是在开玩笑。
2021-04-23 23:04:24
除了抨击那些没有允许类型提示祝福的功能的人之外,我可能想指出 typescript:typescriptlang.org基本上是 EM6 + 类型提示
2021-05-08 23:04:24
@JeffreySweeney 这不是福气。是癌症。
2021-05-09 23:04:24
@Toskan 我不会说这不是一种祝福。我已经使用 JavaScript 四年了,这就是某些语言的特性。编程语言集的范围应该从弱类型到强类型,就像它应该从低级到高级一样。此外,JavaScript 提供了instanceoftypeof关键字来帮助实现这一点。虽然这会占用更多的代码,但也许开发人员选择 JavaScript 作为主要依赖于类型的语言的语言。至于庞大的nodejs后端应用程序?我觉得应该是常识。
2021-05-11 23:04:24

不是在 javascript 中,而是使用 Google Closure Compiler 的高级模式,您可以这样做:

/**
 * @param {Date} myDate The date
 * @param {string} myString The string
 */
function myFunction(myDate, myString)
{
    //do stuff
}

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

这也适用于/启用 Eclipse JavaScript Editor - Outline ViewCode Completionfoo( /*MyType*/ param )这里描述方式也有效:stackoverflow.com/a/31420719/1915920
2021-04-18 23:04:24
也用于 VSCode。
2021-05-13 23:04:24
我意识到这个问题有多老了,但我想指出它在 IntelliJ 中受到尊重。这里的答案非常低估。
2021-05-15 23:04:24

虽然您无法有关类型的信息告知 JavaScript 但您可以有关类型的信息告知您的 IDE,因此您可以获得更有用的自动完成功能。

这里有两种方法可以做到这一点:

  1. 使用JSDoc,一种在注释中记录 JavaScript 代码的系统。特别是,您将需要@param指令

    /**
     * @param {Date} myDate - The date
     * @param {string} myString - The string
     */
    function myFunction(myDate, myString) {
      // ...
    }
    

    您也可以使用 JSDoc 来定义自定义类型并在@param指令中指定这些类型,但请注意 JSDoc 不会进行任何类型检查;它只是一个文档工具。要检查 JSDoc 中定义的类型,请查看TypeScript,它可以解析 JSDoc 标签

  2. 通过在 a 中的参数之前指定类型来使用类型提示
    /* comment */

    WebStorm 中的 JavaScript 类型提示

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

typescript

对于实际的类型检查,最接近的解决方案是使用 TypeScript,一个(主要是)JavaScript 的超集。这是5 分钟后TypeScript

@AnandUndavia 对于 VSCode,您可以使用选项 1,但据我所知只能使用ESLint扩展。顺便说一下,很抱歉(非常)迟到的回复。
2021-04-18 23:04:24
@negrotico19:vi是一个被过度滥用的编辑器,而不是一个 IDE。您可以在 中做很多事情vi,就像您可以在 Excel 中制作音乐视频一样好主意?可能不是。为工作使用正确的工具。
2021-04-27 23:04:24
谢谢。尽管这取决于 IDE。我用的是VI,不能用。
2021-04-28 23:04:24
怎么弄这个VSCode
2021-05-06 23:04:24

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

定义:

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

类型检查:

$> flow
hello.js:3:10,21: number
This type is incompatible with
  hello.js:2:37,42: string

这是运行它的方法

如果 x 是日期类型,如何添加类型定义?即 foo(x: Date) : string { }。这是正确的方法吗?
2021-05-10 23:04:24

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

使用这种方法,您可以构建一个完整的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