javascript函数参数、返回值类型检查
实现带参数、返回值类型声明的js函数:
类型定义:
window.Str = Type.Str = Type.define('STRING', Type.isStr);
var Per = Type.define('PERSON', function(p){
return p && p.type === 'person' && p.name;
});
定义函数:
var addStr = Str(function(a, b){
return a + b;
}, Str, Str);
运行:
addStr('1', 1);
则报错:
TypeError: Unexpected argument, expecting STRING (arg[1])
定义函数:
var addToStr = Str(function(a, b){
return a + b;
});
运行:
addToStr(1, 1);
则报错:
TypeError: Unexpected result, expecting STRING
1. [代码]define Type
/*
* The main class: Type
*/
var Type = function(){
this.author = {
name: 'nighca',
email: 'nighca@live.cn'
};
};
2. [代码]type mehods
/*
* func define/destroy to define/destroy a type
*/
Type.__defined__ = {};
Type.define = function(name, check, override){
var Type = this;
if(!Type.isStr(name) || !Type.isFunc(check)){
throw new TypeError('Param error');
}else if(!override && this.__defined__[name]){
throw new Error('Type ' + name + ' already exists');
}else{
var funcCreator = function(func){
var argumentTypes = Array.prototype.slice.call(arguments, 1);
var wrapper = function(){
for (var i = 0, l = argumentTypes.length; i < l; i++) {
if(argumentTypes[i] && !argumentTypes[i].check(arguments[i])){
throw new TypeError(
'Unexpected argument, expecting ' +
argumentTypes[i].typeName +
' (arg[' + i + '])'
);
}
};
var ret = func.apply(this, arguments);
if(!check(ret)){
throw new TypeError('Unexpected result, expecting ' + name);
}
return ret;
};
wrapper.toString = function(){
return func.toString();
};
return wrapper;
};
funcCreator.check = check;
funcCreator.typeName = name;
funcCreator.constructor = Type;
funcCreator.__proto__ = Type.prototype;
return this.__defined__[name] = funcCreator;
}
};
Type.isType = function(t){
return t && t.constructor === Type;
}
Type.mix = function(name){
var types, type;
if(!Type.isStr(name)){
types = Array.prototype.slice.call(arguments, 0);
name = null;
}else{
types = Array.prototype.slice.call(arguments, 1);
}
if(types.length < 2){
throw new Error('Params error');
}
var i, l;
for (i = 0, l = types.length; i < l; i++) {
if(!Type.isType(types[i])){
throw new TypeError('Param not a type');
}
}
if(!name){
name = 'MIX_OF_' + types[0].typeName;
for (i = 1, l = types.length; i < l; i++) {
name += '_' + types[i].typeName;
}
name += '@' + Date.now();
}
var checker = function(obj){
for (var i = 0, l = types.length; i < l; i++) {
if(!types[i].check(obj)){
return false;
}
}
return true;
};
return Type.define(name, checker);
};http://www.huiyi8.com/jianbihua/
简笔画大全
Type.any = function(name){
var types, type;
if(!Type.isStr(name)){
types = Array.prototype.slice.call(arguments, 0);
name = null;
}else{
types = Array.prototype.slice.call(arguments, 1);
}
if(types.length < 2){
throw new Error('Params error');
}
var i, l;
for (i = 0, l = types.length; i < l; i++) {
if(!Type.isType(types[i])){
throw new TypeError('Param not a type');
}
}
if(!name){
name = 'ANY_OF_' + types[0].typeName;
for (i = 1, l = types.length; i < l; i++) {
name += '_' + types[i].typeName;
}
name += '@' + Date.now();
}
var checker = function(obj){
for (var i = 0, l = types.length; i < l; i++) {
if(types[i].check(obj)){
return true;
}
}
return false;
};
return Type.define(name, checker);
};
Type.isDefined = function(name){
return !!this.__defined__[name];
};
Type.destroy = function(name){
if(!Type.isStr(name)){
throw new TypeError('Param error');
}
var type = this.__defined__[name];
if(type){
type = null;
delete this.__defined__[name];
}
};
Type.prototype.suicide = function(){
this.constructor.destroy(this.typeName);
};
3. [代码]some help funcs
/*
* Some funcs to judge obj type
*/
Type.toString = function(){
return JSON ? JSON.stringify(new this()) : '>_<';
};
Type.format = function(obj){
return Object.prototype.toString.call(obj);
};
Type.isNum = function(obj){
return typeof obj === 'number' || Type.format(obj) === '[object Number]';
};
Type.isStr = function(obj){
return typeof obj === 'string' || Type.format(obj) === '[object String]';
};
Type.isFunc = function(obj){
return typeof obj === 'function' || Type.format(obj) === '[object Function]';
};
Type.isBool = function(obj){
return typeof obj === 'boolean' || Type.format(obj) === '[object Boolean]';
};
Type.isArr = function(obj){
return Type.format(obj) === '[object Array]';
};
Type.isReg = function(obj){
return Type.format(obj) === '[object RegExp]';
};
Type.isObj = function(obj){
return Type.format(obj) === '[object Object]';
};
Type.isUndef = function(obj){
return typeof obj === 'undefined';
};
Type.isNul = function(obj){
return Type.format(obj) === '[object Null]';
};
Type.isVoid = function(obj){
return true;
};
4. [代码]Some default types
/*
* Some default types binded to window & Type
*/
window.Num = Type.Num = Type.define('NUMBER', Type.isNum);
window.Str = Type.Str = Type.define('STRING', Type.isStr);
window.Func = Type.Func = Type.define('FUNCTION', Type.isFunc);
window.Bool = Type.Bool = Type.define('BOOLEAN', Type.isBool);
window.Arr = Type.Arr = Type.define('ARRAY', Type.isArr);
window.Reg = Type.Reg = Type.define('REGEXP', Type.isReg);
window.Obj = Type.Obj = Type.define('OBJECT', Type.isObj);
window.Undef = Type.Undef = Type.define('UNDEFINED', Type.isUndef);
window.Nul = Type.Nul = Type.define('NULL', Type.isNul);
window.Void = Type.Void = Type.define('VOID', Type.isVoid);
javascript函数参数、返回值类型检查的更多相关文章
- JAVA函数的返回值类型详解以及生成随机数的例题
函数的四要素:函数名.输入.输出(返回).加工. 函数分为两种:一种是有返回值得函数,一种是没有返回值的函数. 1. 定义:没有返回值的函数:(当我不需要函数的计算结果再拿出来进行运算的时候,我就不需 ...
- Swift 定义函数 参数 返回值
定义多参数函数 - 用func声明函数 func name(parameters) -> return type { function body } func halfOpenRangeLen ...
- Swift2.0语言教程之函数的返回值与函数类型
Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...
- MATLAB importdata函数返回值类型
importdata函数是MATLAB中I/O文件操作的一个重要函数.需要注意的是,针对不同的文件内容,importdata函数的返回值类型也有所不同. MATLAB帮助文档中的详细说明如下: Bas ...
- 请为main函数提供返回值
很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的.C/C++ 中从来没有定义过void main( ).C++ 之父 Bjarne Stroustrup 在他的主页上的 ...
- php7函数,声明,返回值等新特性介绍
使用 ... 运算符定义变长参数函数 (PHP 5 >= 5.6.0, PHP 7) 现在可以不依赖 func_get_args(), 使用 ... 运算符 来实现 变长参数函数. functi ...
- c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义?
c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义? 比如方法max1的返回值是用typedef定义出来的mint,那么在类外如何定义这个方法呢? tem ...
- javascript . 03 函数定义、函数参数(形参、实参)、函数的返回值、冒泡函数、函数的加载、局部变量与全局变量、隐式全局变量、JS预解析、是否是质数、斐波那契数列
1.1 知识点 函数:就是可以重复执行的代码块 2. 组成:参数,功能,返回值 为什么要用函数,因为一部分代码使用次数会很多,所以封装起来, 需要的时候调用 函数不调用,自己不会执行 同名函数会覆盖 ...
- c++特性:指向类成员的指针和非类型类模板参数和函数指针返回值 参数推导机制和关联型别
一.c++允许定义指向类成员的指针,包括类函数成员指针和类数据成员指针 格式如下: class A { public: void func(){printf("This is a funct ...
随机推荐
- xtu read problem training A - Dividing
A - Dividing Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Descri ...
- HDU 5245
题目大意: 每次随机选择两个点,便把这两个点之间形成的子矩阵上的每一个方块涂色,问随机选择k次,整个m*n的矩阵中有多少个小方块被涂上了颜色 这道题不难,但自己智商实在捉急,一直想不出来... 因为这 ...
- 【构造+DFS】2017多校训练三 HDU 6060 RXD and dividing
acm.hdu.edu.cn/showproblem.php?pid=6060 [题意] 给定一棵以1为根的树,把这颗树除1以外的结点划分为k个集合(可以有空集),把1加入划分后的集合 每个集合的结点 ...
- HDU 6441 费马大定理+勾股数
#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define fi first #define se ...
- HDU 5512 Pagodas【博弈】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5512 题意: 给定集合,最初有两个数a,b,如果两个人依次使用集合中的元素相加减,如果得到的数均不在 ...
- [bzoj4199][Noi2015]品酒大会_后缀自动机_后缀树_树形dp
品酒大会 bzoj-4199 Noi-2015 题目大意:给定一个字符串,如果其两个子串的前$r$个字符相等,那么称这两个子串的开头两个位置$r$相似.如果两个位置勾兑在一起那么美味度为两个位置的乘积 ...
- Flatten Binary Tree to Linked List (DFS)
Given a binary tree, flatten it to a linked list in-place. For example,Given 1 / \ 2 5 / \ \ 3 4 6 T ...
- Generate Parentheses(组合,回溯)
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- ArrayList和LinkedList区别(蚂蚁金服面试题)
1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全: 2. 底层数据结构: Arraylist 底层使用的是Object数组:LinkedLis ...
- 操作redis有关的命令
)连接操作命令 quit:关闭连接(connection) auth:简单密码认证 help cmd: 查看cmd帮助,例如:help quit )持久化 save:将数据同步保存到磁盘 bgsave ...