我尝试构建包装集合的模块失败
我有类似的东西:
// topic: chess gaming
// file: src/core/Refs.js
const COLS = 'abcdefgh'.split('')
const ROWS = '12345678'.split('')
const ALL = new Map()
class Ref {
constructor (col, row) {
this.col = col
this.row = row
this.key = String(col + row)
}
// translate to ref to obtain another
// or null, if off-board
//
// ref.translate(0, 0) === ref (ok ?)
//
translate (dcol, drow) {
// compute something for dcol and drow
// ...
return ALL.get( COLS[colIdx] + ROWS[rowIdx] )
}
}
// the code which seems to not work propertly
for(let c of COLS) {
for(let r of ROWS) {
ALL.set(String(c + r), new Ref(c, r))
}
}
export default {
COLS, ROWS, ALL,
has (ref) {
return ALL.has(ref)
},
get (ref) {
return ALL.get(ref)
},
// trying to grant/warrant "immutability"
// for the "ALL" collection inside the module
keys() {
return [...ALL.keys()]
}
}
在我使用带有正确标志(dangerousForOf,..)和 objectAssign 的 Buble 编译模块之后
然后我用 karma + jasmine 测试,第一个测试:
it ('should be 64-length array', function () {
expect (Refs.keys().length).toEqual(64)
})
将 faim 与“期望 1 等于 64”,并且 Refs.ALL 的日志似乎显示一个空的 Map 尽管 Refs.COLS 和 Refs.ROWS 已正确初始化。
发生了什么以及如何解决它?
编辑:
@Bergi:当然,公开 Refs.ALL 破坏了不变性,而是出于调试目的
我不确定如何捕获测试包输出,但是查看 gulp+rollup 开发包,方法 keys() 行:
return [...ALL.keys()]
被替换为:
return [].concat(ALL.keys())
它产生一个包含 MapIterator 的 1 元素数组,这打破了测试。把类似的东西:
return Array.from( ALL.keys() )
将解决问题,但有可能无法在旧版浏览器中正常工作!
我已经在我的仓库中推送了代码:https ://github.com/hefeust/colorchess-v2
希望这可以帮助修复错误:如何将源代码中的扩展 (...) 运算符转换为具有正确 Object.assign polyfill 的捆绑包?