From fed1125b0e5e6e03bd058cb421e9423ef0fb19f8 Mon Sep 17 00:00:00 2001 From: Bingjia Yang <95595902+YBJ0000@users.noreply.github.com> Date: Mon, 18 May 2026 21:01:49 +1000 Subject: [PATCH] fix(expect): allow readonly arrays and sets in toBeOneOf (fix #10264) (#10374) --- packages/expect/src/types.ts | 2 +- test/unit/test/expect.test-d.ts | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/expect/src/types.ts b/packages/expect/src/types.ts index c2716caa2..5a037085e 100644 --- a/packages/expect/src/types.ts +++ b/packages/expect/src/types.ts @@ -152,7 +152,7 @@ interface CustomMatcher { * expect('foo').toBeOneOf([expect.any(String)]) * expect({ a: 1 }).toEqual({ a: expect.toBeOneOf(['1', '2', '3']) }) */ - toBeOneOf: (sample: Array | Set) => any + toBeOneOf: (sample: ReadonlyArray | ReadonlySet) => any } export interface AsymmetricMatchersContaining extends CustomMatcher { diff --git a/test/unit/test/expect.test-d.ts b/test/unit/test/expect.test-d.ts index 20e480bb9..a37559ba4 100644 --- a/test/unit/test/expect.test-d.ts +++ b/test/unit/test/expect.test-d.ts @@ -119,4 +119,24 @@ test('expect.* allows asymmetrict mattchers with different types', () => { expect(value).toMatchObject(value) } expectMany({ enabled: true, data: 'ok' }) + + // toBeOneOf accepts readonly arrays and sets + // https://github.com/vitest-dev/vitest/issues/10264 + { + const allowed = ['A', 'B'] as const + expect('A').toBeOneOf(allowed) + expect('A').toEqual(expect.toBeOneOf(allowed)) + + const readonlyArray: ReadonlyArray = ['A', 'B'] + expect('A').toBeOneOf(readonlyArray) + expect('A').toEqual(expect.toBeOneOf(readonlyArray)) + + const readonlySet: ReadonlySet = new Set(['A', 'B']) + expect('A').toBeOneOf(readonlySet) + expect('A').toEqual(expect.toBeOneOf(readonlySet)) + + // mutable arrays and sets still work + expect('A').toBeOneOf(['A', 'B']) + expect('A').toBeOneOf(new Set(['A', 'B'])) + } }) -- 2.51.2