fix(reactivity): explicitly do type conversions in warning strings (#129)
This commit is contained in:
parent
3d975247cd
commit
5eacfaf210
@ -13,6 +13,11 @@ import {
|
|||||||
} from '../src'
|
} from '../src'
|
||||||
import { mockWarn } from '@vue/runtime-test'
|
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', () => {
|
describe('reactivity/readonly', () => {
|
||||||
mockWarn()
|
mockWarn()
|
||||||
|
|
||||||
@ -38,27 +43,51 @@ describe('reactivity/readonly', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('should not allow mutation', () => {
|
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
|
observed.foo = 2
|
||||||
expect(observed.foo).toBe(1)
|
expect(observed.foo).toBe(1)
|
||||||
expect(
|
expect(
|
||||||
`Set operation on key "foo" failed: target is readonly.`
|
`Set operation on key "foo" failed: target is readonly.`
|
||||||
).toHaveBeenWarnedLast()
|
).toHaveBeenWarnedLast()
|
||||||
|
|
||||||
observed.bar.baz = 3
|
observed.bar.baz = 3
|
||||||
expect(observed.bar.baz).toBe(2)
|
expect(observed.bar.baz).toBe(2)
|
||||||
expect(
|
expect(
|
||||||
`Set operation on key "baz" failed: target is readonly.`
|
`Set operation on key "baz" failed: target is readonly.`
|
||||||
).toHaveBeenWarnedLast()
|
).toHaveBeenWarnedLast()
|
||||||
|
|
||||||
|
observed[qux] = 4
|
||||||
|
expect(observed[qux]).toBe(3)
|
||||||
|
expect(
|
||||||
|
`Set operation on key "Symbol(qux)" failed: target is readonly.`
|
||||||
|
).toHaveBeenWarnedLast()
|
||||||
|
|
||||||
delete observed.foo
|
delete observed.foo
|
||||||
expect(observed.foo).toBe(1)
|
expect(observed.foo).toBe(1)
|
||||||
expect(
|
expect(
|
||||||
`Delete operation on key "foo" failed: target is readonly.`
|
`Delete operation on key "foo" failed: target is readonly.`
|
||||||
).toHaveBeenWarnedLast()
|
).toHaveBeenWarnedLast()
|
||||||
|
|
||||||
delete observed.bar.baz
|
delete observed.bar.baz
|
||||||
expect(observed.bar.baz).toBe(2)
|
expect(observed.bar.baz).toBe(2)
|
||||||
expect(
|
expect(
|
||||||
`Delete operation on key "baz" failed: target is readonly.`
|
`Delete operation on key "baz" failed: target is readonly.`
|
||||||
).toHaveBeenWarnedLast()
|
).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', () => {
|
it('should allow mutation when unlocked', () => {
|
||||||
|
@ -107,7 +107,7 @@ export const readonlyHandlers: ProxyHandler<any> = {
|
|||||||
if (LOCKED) {
|
if (LOCKED) {
|
||||||
if (__DEV__) {
|
if (__DEV__) {
|
||||||
console.warn(
|
console.warn(
|
||||||
`Set operation on key "${key as any}" failed: target is readonly.`,
|
`Set operation on key "${String(key)}" failed: target is readonly.`,
|
||||||
target
|
target
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -121,7 +121,9 @@ export const readonlyHandlers: ProxyHandler<any> = {
|
|||||||
if (LOCKED) {
|
if (LOCKED) {
|
||||||
if (__DEV__) {
|
if (__DEV__) {
|
||||||
console.warn(
|
console.warn(
|
||||||
`Delete operation on key "${key as any}" failed: target is readonly.`,
|
`Delete operation on key "${String(
|
||||||
|
key
|
||||||
|
)}" failed: target is readonly.`,
|
||||||
target
|
target
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user