我已经用尽我的Google fu来寻找如何在ES6模块方法中最好地断言参数的例子,或者处理可能传递的数据类型的不确定性。即介于字符串和数字类型之间。几个小时以来,我一直在为一个计算属性和MobX的奇怪行为问题而头疼,在这里我有一些测试代码,可以初始化默认发送的值,并且工作正常。计算出的值取一个初始值,从相关数据(贷项和借项)中求出两个总数,然后加上借项并减去贷项以返回调整后的值。所以返回的初始值(1000)+totalDebits(0)-totalCredits(0)返回1000。很简单。但是,当我添加了一个对话框,在列表中输入一个初始值为2000的新项时,我的计算值将返回20000!奇怪的是,我将这些对象保存到本地存储,当从存储的值中刷新时,计算的总数仍然有20000,但是其他现有值具有与它们的初始值相匹配的正确计算值。
我终于找到了它的原因,并在持久状态下验证了它:输入页面中的initialBalance被存储为“2000”,一个字符串文本2000“+0-0,将0添加到字符串中,同时忽略减号。
我的问题是,对于普通JS或合适的ES6库,有哪些选项可用于处理可能进入MobX操作等函数的类型?加上处理JS参数时的最佳实践建议。
例如:
在我的组件中,有一个onChange事件
onInitialBalanceChange(e){
const value = e.target.value;
const account = this.state.account;
let validationError = null;
let isBalanceValid = true;
if(!this.validateInitialBalance(value)){
validationError = 'The initial balance must be a positive number.'
isBalanceValid = false;
}
account.updateInitialBalance(value);
this.setState({validationError: validationError, isBalanceValid: isBalanceValid, isComplete: isBalanceValid && this.state.isNameValid});
}
updateInitialBalance注册为MobX操作:
updateInitialBalance(initialBalance){
if (!!initialBalance) this.initialBalance = initialBalance;
return this;
}
我有一个断言,参数不是空的,但是除了一个重要的if()条件外,断言/转换它的类型的最佳实践是什么?initialBalance可以是字符串“2000”或数字2000,它还应该防止无效数据,如“弗莱德”??所以我提出了在duck类型的世界中进行可靠类型检查的问题。
从我看来,这似乎是可行的,但根据文件来看,这有点“错误”:
if (!!initialBalance) this.initialBalance = parseInt(initialBalance);
parseInt接受“string”,但是如果initialBalance已经是一个数字(而不是一个数字字符串),那么这似乎也可以工作。