编辑:我发现了这个有趣的库,看起来它可以完全按照我在底部所描述的:https ://github.com/philbooth/check-types.js
看起来你可以通过调用 check.quacksLike 来做到这一点。
我对使用 javascript 还很陌生,我很喜欢它提供的强大功能,但有时它太灵活了,我的理智无法处理。我想要一种简单的方法来强制某些参数尊重特定的接口。
这是一个简单的示例方法,突出了我的问题:
var execute = function(args)
{
executor.execute(args);
}
假设 executor 期望args
有一个名为 的属性cmd
。如果未定义,则当程序尝试引用cmd
但它是undefined
. cmd
与在此方法中显式强制 ' 的存在相比,这样的错误调试起来会更烦人。执行者甚至可能期望它args
有一个被调用的函数getExecutionContext()
,它会被传递一点。我可以想象更复杂的场景,调试将很快成为追踪函数调用以查看第一次传入参数的位置的噩梦。
我也不想做以下事情:
var execute = function(args)
{
if(args.cmd === undefined || args.getExecutionContext === undefined ||
typeof args.getExecutionContext !== 'function')
throw new Error("args not setup correctly");
executor.execute(args);
}
这将需要对每个具有参数的函数进行大量维护,特别是对于复杂参数。我宁愿能够指定一个接口并以某种方式强制执行一个合同,告诉 javascript 我希望输入匹配这个接口。
也许是这样的:
var baseCommand =
{
cmd: '',
getExecutionContext: function(){}
};
var execute = function(args)
{
enforce(args, baseCommand); //throws an error if args does not honor
//baseCommand's properties
executor.execute(args);
}
然后,我可以在我的不同函数中重用这些接口,并定义扩展它们以传递到我的函数的对象,而不必担心拼写错误的属性名称或传入错误的参数。关于如何实现这一点,或者我可以在哪里利用现有实现的任何想法?