diff --git a/packages/reactivity/__tests__/reactive.spec.ts b/packages/reactivity/__tests__/reactive.spec.ts index 5e1e0922e50..ab953ff891a 100644 --- a/packages/reactivity/__tests__/reactive.spec.ts +++ b/packages/reactivity/__tests__/reactive.spec.ts @@ -277,6 +277,11 @@ describe('reactivity/reactive', () => { expect(isReactive(obj.bar)).toBe(false) }) + test('markRaw should skip non-extensible objects', () => { + const obj = Object.seal({ foo: 1 }) + expect(() => markRaw(obj)).not.toThrowError() + }) + test('should not observe non-extensible objects', () => { const obj = reactive({ foo: Object.preventExtensions({ a: 1 }), diff --git a/packages/reactivity/src/reactive.ts b/packages/reactivity/src/reactive.ts index 6e98fedeaf4..8b94dd9a47f 100644 --- a/packages/reactivity/src/reactive.ts +++ b/packages/reactivity/src/reactive.ts @@ -385,7 +385,9 @@ export type Raw = T & { [RawSymbol]?: true } * @see {@link https://vuejs.org/api/reactivity-advanced.html#markraw} */ export function markRaw(value: T): Raw { - def(value, ReactiveFlags.SKIP, true) + if (Object.isExtensible(value)) { + def(value, ReactiveFlags.SKIP, true) + } return value }