1 分钟让你的函数具有参数检查的功能
发布于 8 年前 作者 stonephp 4251 次浏览 来自 分享

前言

JavaScript 由于是动态语言,弱类型,所以js开发这往往有意无意就忽略了类型带来的问题,而js里又有很多隐式的类型转换,这些类型转换规则及其复杂多样,掌握和理解实属不易,所以尽量避免类型转换是一个更加可取的方式。

上代码

var add = function(a, b) {
	return a + b;
}

一个很简单的函数,求两个数的和,这么简单的一个需求,很容易随手就写成这样了。但是其实完全没有考虑异常,如果 a 或者 b 不是Number会如何?

a = 'hello ', b = 'worlld';// return 'hello wolrd'
a = 'hello', b = 2;// return ?
a = 2, b = 'hello'; // return ?
a = 'hello', b = ['world']; //return ?
a = 'hello', b = new Date(); //return ?
a = null, b = 2; // return ?
a = undefined, b = 2; // return ?
a = NaN, b = 2; // return ?

情况是不是有点糟糕,如果此时你的函数是有参数校验功能的会如何呢,显然会在调用的时候给出明确的错误, 调用着很容易发现自己的错误。但是每个函数都要一个个去修改很麻烦,那么如果是下面这样的写法呢。

var add = function(a, b) {
	return a + b;
};

add = delegate(add, [{
	name: 'num1',
	type: Number,
	message: '第一个参数必须是数字'
}, {
	name: 'num2',
	type: Number,
	message: '第二个参数必须是数字'
}]);

此时如果你再次调用 add 函数,只要类型不正确他就会报告错误,除此之外处理后的 add 函数还可以链式调用,如下:

add.num1(20).num2(50).exex(); // return 70
// or
add.num2(500).num1(300).exec(); // return 800

参数的顺序无所谓了。使用者记忆的是参数的名称,对于参数比较多的函数变得无比方便。

func-delegate

2 回复

用 typescript 吧

@miluu 这个东西主要是针对已有的函数做一个改造, 另外我这个例子里只用了很简单的类型做校验,实际功能很丰富,不仅仅是一个type的问题。

回到顶部