Skip to content

Commit 99ab193

Browse files
fix(type-utils): union types always being marked as readonly (#4419)
1 parent ef3147c commit 99ab193

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

Diff for: packages/type-utils/src/isTypeReadonly.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,8 @@ function isTypeReadonlyRecurser(
216216
const result = unionTypeParts(type).every(
217217
t =>
218218
seenTypes.has(t) ||
219-
isTypeReadonlyRecurser(checker, t, options, seenTypes),
219+
isTypeReadonlyRecurser(checker, t, options, seenTypes) ===
220+
Readonlyness.Readonly,
220221
);
221222
const readonlyness = result ? Readonlyness.Readonly : Readonlyness.Mutable;
222223
return readonlyness;

Diff for: packages/type-utils/tests/isTypeReadonly.test.ts

+27
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,33 @@ describe('isTypeReadonly', () => {
137137
);
138138
});
139139
});
140+
141+
describe('Union', () => {
142+
describe('is readonly', () => {
143+
const runTests = runTestIsReadonly;
144+
145+
it.each([
146+
[
147+
'type Test = Readonly<{ foo: string; bar: number; }> & Readonly<{ bar: number; }>;',
148+
],
149+
['type Test = readonly string[] | readonly number[];'],
150+
])('handles a union of 2 fully readonly types', runTests);
151+
});
152+
153+
describe('is not readonly', () => {
154+
const runTests = runTestIsNotReadonly;
155+
156+
it.each([
157+
['type Test = { foo: string; bar: number; } | { bar: number; };'],
158+
[
159+
'type Test = { foo: string; bar: number; } | Readonly<{ bar: number; }>;',
160+
],
161+
[
162+
'type Test = Readonly<{ foo: string; bar: number; }> | { bar: number; };',
163+
],
164+
])('handles a union of non fully readonly types', runTests);
165+
});
166+
});
140167
});
141168

142169
describe('treatMethodsAsReadonly', () => {

0 commit comments

Comments
 (0)