feat(computed): warn if trying to set a readonly computed (#161)

This commit is contained in:
Dmitry Sharshakov 2019-10-09 19:20:53 +03:00 committed by Evan You
parent 7963c01a67
commit 530be302fc
2 changed files with 24 additions and 2 deletions

View File

@ -1,6 +1,16 @@
import { computed, reactive, effect, stop, ref } from '../src' import {
computed,
reactive,
effect,
stop,
ref,
WritableComputedRef
} from '../src'
import { mockWarn } from '@vue/runtime-test'
describe('reactivity/computed', () => { describe('reactivity/computed', () => {
mockWarn()
it('should return updated value', () => { it('should return updated value', () => {
const value = reactive<{ foo?: number }>({}) const value = reactive<{ foo?: number }>({})
const cValue = computed(() => value.foo) const cValue = computed(() => value.foo)
@ -157,4 +167,14 @@ describe('reactivity/computed', () => {
plusOne.value = 0 plusOne.value = 0
expect(dummy).toBe(-1) expect(dummy).toBe(-1)
}) })
it('should warn if trying to set a readonly computed', () => {
const n = ref(1)
const plusOne = computed(() => n.value + 1)
;(plusOne as WritableComputedRef<number>).value++ // Type cast to prevent TS from preventing the error
expect(
'Write operation failed: computed value is readonly'
).toHaveBeenWarnedLast()
})
}) })

View File

@ -29,7 +29,9 @@ export function computed<T>(
: (getterOrOptions as WritableComputedOptions<T>).get : (getterOrOptions as WritableComputedOptions<T>).get
const setter = isReadonly const setter = isReadonly
? () => { ? () => {
// TODO warn attempting to mutate readonly computed value if (__DEV__) {
console.warn('Write operation failed: computed value is readonly')
}
} }
: (getterOrOptions as WritableComputedOptions<T>).set : (getterOrOptions as WritableComputedOptions<T>).set