有没有办法让javascript函数知道某个参数是某种类型?
能够做这样的事情将是完美的:
function myFunction(Date myDate, String myString)
{
//do stuff
}
谢谢!
更新:由于答案是一个响亮的“不”,如果我想myDate
被视为一个日期(以便在其上调用日期函数),我必须将其转换为函数内的日期或设置一个新变量输入日期吗?
有没有办法让javascript函数知道某个参数是某种类型?
能够做这样的事情将是完美的:
function myFunction(Date myDate, String myString)
{
//do stuff
}
谢谢!
更新:由于答案是一个响亮的“不”,如果我想myDate
被视为一个日期(以便在其上调用日期函数),我必须将其转换为函数内的日期或设置一个新变量输入日期吗?
不,JavaScript 不是静态类型语言。有时您可能需要手动检查函数体中的参数类型。
不是在 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
虽然您无法将有关类型的信息告知 JavaScript ,但您可以将有关类型的信息告知您的 IDE,因此您可以获得更有用的自动完成功能。
这里有两种方法可以做到这一点:
使用JSDoc,一种在注释中记录 JavaScript 代码的系统。特别是,您将需要@param
指令:
/**
* @param {Date} myDate - The date
* @param {string} myString - The string
*/
function myFunction(myDate, myString) {
// ...
}
您也可以使用 JSDoc 来定义自定义类型并在@param
指令中指定这些类型,但请注意 JSDoc 不会进行任何类型检查;它只是一个文档工具。要检查 JSDoc 中定义的类型,请查看TypeScript,它可以解析 JSDoc 标签。
通过在 a 中的参数之前指定类型来使用类型提示
/* comment */
:
这是一种非常普遍的技术,例如被 ReactJS使用。对于传递给第 3 方库的回调参数非常方便。
对于实际的类型检查,最接近的解决方案是使用 TypeScript,一个(主要是)JavaScript 的超集。这是5 分钟后的TypeScript。
您可以在您的函数中使用包装器来实现一个自动处理类型检查的系统。
使用这种方法,您可以构建一个完整的
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