0

我尝试构建包装集合的模块失败

我有类似的东西:

// 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 的捆绑包?

4

1 回答 1

2

Bublé 不支持迭代器,这就是它使用扩展语法将数组文字转换为连接的原因。改为使用Array.from(无论如何这更具描述性)。

return Array.from( ALL.keys() )将解决问题,但有在旧版浏览器中无法正常工作的风险!

这应该无关紧要 - 您正在使用返回迭代器的Map对象及其keys()方法,这在旧版浏览器中也不起作用。如果您打算支持它们,则无论如何您都必须使用 polyfill - 而且您也会得到一个 polyfill Array.from

于 2017-08-19T12:11:39.417 回答