From 5eacfaf210b4c18c546ec225a92683be5cecb64e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=88=E8=BF=B7=E6=B4=A5=E6=B8=A1?= Date: Sun, 6 Oct 2019 23:26:33 +0800 Subject: [PATCH] fix(reactivity): explicitly do type conversions in warning strings (#129) --- .../reactivity/__tests__/readonly.spec.ts | 31 ++++++++++++++++++- packages/reactivity/src/baseHandlers.ts | 6 ++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/packages/reactivity/__tests__/readonly.spec.ts b/packages/reactivity/__tests__/readonly.spec.ts index 3ed49dbed..989d4759a 100644 --- a/packages/reactivity/__tests__/readonly.spec.ts +++ b/packages/reactivity/__tests__/readonly.spec.ts @@ -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 = { -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 = 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', () => { diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 7b64c6ed6..ff163179f 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -107,7 +107,7 @@ export const readonlyHandlers: ProxyHandler = { 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 = { 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 ) }