是否有一种方法可以让javascript函数知道某个参数是某个类型的?
能够做这样的事情将是完美的:
function myFunction(Date myDate, String myString)
{
//do stuff
}
谢谢你!
更新:作为答案是一个响亮的“不”,如果我想myDate被视为一个日期(为了在它上调用日期函数),我必须将其转换为函数内的日期或设置一个日期类型的新变量?
是否有一种方法可以让javascript函数知道某个参数是某个类型的?
能够做这样的事情将是完美的:
function myFunction(Date myDate, String myString)
{
//do stuff
}
谢谢你!
更新:作为答案是一个响亮的“不”,如果我想myDate被视为一个日期(为了在它上调用日期函数),我必须将其转换为函数内的日期或设置一个日期类型的新变量?
当前回答
不,JavaScript不是静态类型语言。有时可能需要手动检查函数体中的参数类型。
其他回答
编辑:七年后,这个答案仍然偶尔会得到点赞。如果您正在寻找运行时检查,这很好,但我现在建议使用Typescript或可能的Flow进行编译时类型检查。更多信息请参见https://stackoverflow.com/a/31420719/610585。
最初的回答:
它不是内置在语言中,但你可以很容易地自己做。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
使用typeof或instanceof:
const assert = require('assert');
function myFunction(Date myDate, String myString)
{
assert( typeof(myString) === 'string', 'Error message about incorrect arg type');
assert( myDate instanceof Date, 'Error message about incorrect arg type');
}
TypeScript是目前最好的解决方案之一。
TypeScript通过向语言中添加类型来扩展JavaScript。
Typescript版本演示
// type alias
type myDateType = Date;
type myStringType = string;
function myFunction(myDate: myDateType, myString: myStringType) {
// do stuff
console.log(`myDate =`, myDate);
console.log(`myString =`, myString);
}
myFunction(new Date(), 'TypeScript is awesome!');
试试这个在线游乐场
refs
https://www.typescriptlang.org/
我假设您允许IDE帮助您;那么下面的答案可能会帮助你。
IDE: jetbrains/Golang如果你的IDE不是这个也没关系。我相信所有支持JSDoc的IDE都能满足您的大部分需求。
它可以很好地显示JSDoc。
Demo
我的- pkg base64编码- js。
/**
* Convert string to the base64 format.
*
* @param str {string} Input string
* @returns {string} some message about return...
* @example
* - btoa(toBinary("☸☹☺☻☼☾☿"))
* - Str2base64("☸☹☺☻☼☾☿")
* @see https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa#unicode_strings
*/
export function Str2base64(str) {
return btoa(toBinary(str))
}
. js
import * as base64 from "../pkg/encoding/base64"
const filenameB64 = base64.Str2base64("test")
有用的JSDoc文档
JSDoc块标签 显示@returns, @param, @type…
其他链接
jetbrains JSDoc /评论
您可以在函数中使用包装器来实现自动处理类型检查的系统。
使用这种方法,您可以构建一个完整的声明式类型检查系统,该系统将为您管理类型检查。 如果您有兴趣更深入地了解这个概念,请查看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