diff --git a/packages/shared/__tests__/toDisplayString.spec.ts b/packages/shared/__tests__/toDisplayString.spec.ts index 4d28714252c..33c0af8df32 100644 --- a/packages/shared/__tests__/toDisplayString.spec.ts +++ b/packages/shared/__tests__/toDisplayString.spec.ts @@ -171,4 +171,26 @@ describe('toDisplayString', () => { }" `) }) + + //#9727 + test('Map with Symbol keys', () => { + const m = new Map([ + [Symbol(), 'foo'], + [Symbol(), 'bar'], + [Symbol('baz'), 'baz'] + ]) + expect(toDisplayString(m)).toMatchInlineSnapshot(` + "{ + \\"Map(3)\\": { + \\"Symbol(0) =>\\": \\"foo\\", + \\"Symbol(1) =>\\": \\"bar\\", + \\"Symbol(baz) =>\\": \\"baz\\" + } + }" + `) + // confirming the symbol renders Symbol(foo) + expect(toDisplayString(new Map([[Symbol('foo'), 'foo']]))).toContain( + String(Symbol('foo')) + ) + }) }) diff --git a/packages/shared/src/toDisplayString.ts b/packages/shared/src/toDisplayString.ts index d7a96c06c1e..83f340e9257 100644 --- a/packages/shared/src/toDisplayString.ts +++ b/packages/shared/src/toDisplayString.ts @@ -6,7 +6,8 @@ import { isPlainObject, isSet, objectToString, - isString + isString, + isSymbol } from './general' /** @@ -31,10 +32,15 @@ const replacer = (_key: string, val: any): any => { return replacer(_key, val.value) } else if (isMap(val)) { return { - [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val]) => { - ;(entries as any)[`${key} =>`] = val - return entries - }, {}) + [`Map(${val.size})`]: [...val.entries()].reduce( + (entries, [key, val], i) => { + entries[ + `${isSymbol(key) ? `Symbol(${key.description ?? i})` : key} =>` + ] = val + return entries + }, + {} as Record + ) } } else if (isSet(val)) { return {