]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): explicitly do type conversions in warning strings (#129)
author月迷津渡 <wuhao.daraw@bytedance.com>
Sun, 6 Oct 2019 15:26:33 +0000 (23:26 +0800)
committerEvan You <yyx990803@gmail.com>
Sun, 6 Oct 2019 15:26:33 +0000 (11:26 -0400)
packages/reactivity/__tests__/readonly.spec.ts
packages/reactivity/src/baseHandlers.ts

index 3ed49dbede89b13a034ec57278c94efd4c5ad8f1..989d4759a41da3c596a82aeda1c623f8a0cb31d3 100644 (file)
@@ -13,6 +13,11 @@ import {
 } from '../src'
 import { mockWarn } from '@vue/runtime-test'
 
+/**
+ * @see https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html
+ */
+type Writable<T> = { -readonly [P in keyof T]: T[P] }
+
 describe('reactivity/readonly', () => {
   mockWarn()
 
@@ -38,27 +43,51 @@ describe('reactivity/readonly', () => {
     })
 
     it('should not allow mutation', () => {
-      const observed: any = readonly({ foo: 1, bar: { baz: 2 } })
+      const qux = Symbol('qux')
+      const original = {
+        foo: 1,
+        bar: {
+          baz: 2
+        },
+        [qux]: 3
+      }
+      const observed: Writable<typeof original> = readonly(original)
+
       observed.foo = 2
       expect(observed.foo).toBe(1)
       expect(
         `Set operation on key "foo" failed: target is readonly.`
       ).toHaveBeenWarnedLast()
+
       observed.bar.baz = 3
       expect(observed.bar.baz).toBe(2)
       expect(
         `Set operation on key "baz" failed: target is readonly.`
       ).toHaveBeenWarnedLast()
+
+      observed[qux] = 4
+      expect(observed[qux]).toBe(3)
+      expect(
+        `Set operation on key "Symbol(qux)" failed: target is readonly.`
+      ).toHaveBeenWarnedLast()
+
       delete observed.foo
       expect(observed.foo).toBe(1)
       expect(
         `Delete operation on key "foo" failed: target is readonly.`
       ).toHaveBeenWarnedLast()
+
       delete observed.bar.baz
       expect(observed.bar.baz).toBe(2)
       expect(
         `Delete operation on key "baz" failed: target is readonly.`
       ).toHaveBeenWarnedLast()
+
+      delete observed[qux]
+      expect(observed[qux]).toBe(3)
+      expect(
+        `Delete operation on key "Symbol(qux)" failed: target is readonly.`
+      ).toHaveBeenWarnedLast()
     })
 
     it('should allow mutation when unlocked', () => {
index 7b64c6ed6ca60fb44c77a47c9952e5b7758c94b7..ff163179f8bbcc48561db93d04716b65a219a732 100644 (file)
@@ -107,7 +107,7 @@ export const readonlyHandlers: ProxyHandler<any> = {
     if (LOCKED) {
       if (__DEV__) {
         console.warn(
-          `Set operation on key "${key as any}" failed: target is readonly.`,
+          `Set operation on key "${String(key)}" failed: target is readonly.`,
           target
         )
       }
@@ -121,7 +121,9 @@ export const readonlyHandlers: ProxyHandler<any> = {
     if (LOCKED) {
       if (__DEV__) {
         console.warn(
-          `Delete operation on key "${key as any}" failed: target is readonly.`,
+          `Delete operation on key "${String(
+            key
+          )}" failed: target is readonly.`,
           target
         )
       }