基于流畅接口的布尔值校验:位运算符是否为最优实现方案?
编辑:解决方案
答案:根据评论反馈,逻辑运算符&&和||可以正常工作。
替换后的代码:
bitwise(bool) { // 替换原有代码 // this.valid = this.valid & (bool >> 0) // 改为如下代码 this.valid = this.valid && bool }
问题
我用构建器模式结合流畅方法实现了一套灵活的值校验方案,校验结果可通过toBoolean()返回布尔值,也能通过toFail()触发失败逻辑。为维护所有断言的状态,我采用了位运算符,但esLint和IDE都会对位运算符的使用发出警告。
预期输出
toBoolean():返回所有断言的综合校验结果toFail():返回原始值,若任一断言失败则抛出错误
当前解决方案
对布尔值执行位运算,代码如下:
class Validator { constructor(any) { this.any = any this.valid = true } bitwise(bool) { this.valid = this.valid & (bool >> 0) !this.valid || this.orFail() } isValue() { this.bitwise(isValue(this.any)) // isValue用于检测null和undefined return this } isObject() { this.bitwise(isObject(this.any)) return this } isNotEmpty() { this.bitwise(!isEmpty(this.any)) return this } toBoolean(){ return this.valid } orFail(message = ""){ if (!this.valid) { throw new InvalidProperty(`TypeError: property is invalid ${message}`); } return this.any } }
可选替代方案
Array.every()或Array.some():用回调栈的方式更优雅,但仍需逻辑方法维护综合状态- 冗长的条件表达式:
!A || !B || !C——扩展性差,属于静态实现
核心疑问
位运算符是不是唯一/最佳的实现方案?有没有更好的方式来实现这种流畅接口?
示例实现
const makeValidator = (any) => new Validator(any) const isHydratedObjectOrFail = (any) => makeValidator(any) .isValue() .isNotEmpty() .isObject() .toFail() const isObject = (any) => makeValidator(any) .isObject() .toBoolean()
内容的提问来源于stack exchange,提问作者Nolan
相关产品推荐
相关产品推荐

