let wmUniqueIndex = Math.round(Math.random() * 9); const supportDefineProperty = typeof Object.defineProperty === 'function'; export default class WeakMap { protected _id: string; constructor() { this._id = '__ec_inner_' + wmUniqueIndex++; } get(key: K): V { return (this._guard(key) as any)[this._id]; } set(key: K, value: V): WeakMap { const target = this._guard(key) as any; if (supportDefineProperty) { Object.defineProperty(target, this._id, { value: value, enumerable: false, configurable: true }); } else { target[this._id] = value; } return this; } delete(key: K): boolean { if (this.has(key)) { delete (this._guard(key) as any)[this._id]; return true; } return false; } has(key: K): boolean { return !!(this._guard(key) as any)[this._id]; } protected _guard(key: K): K { if (key !== Object(key)) { throw TypeError('Value of WeakMap is not a non-null object.'); } return key; } }