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'])) + } })