Просмотр исходного кода

fix(shared): handle Map with symbol keys in toDisplayString (#9731)

close #9727
Carlos Rodrigues 2 лет назад
Родитель
Сommit
364821d6bd

+ 22 - 0
packages/shared/__tests__/toDisplayString.spec.ts

@@ -171,4 +171,26 @@ describe('toDisplayString', () => {
       }"
     `)
   })
+
+  //#9727
+  test('Map with Symbol keys', () => {
+    const m = new Map<any, any>([
+      [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'))
+    )
+  })
 })

+ 11 - 5
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<string, any>
+      )
     }
   } else if (isSet(val)) {
     return {