From 6af7ca7d9fde230342d27ad5a75a09a58c022974 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Mon, 1 Nov 2021 00:59:29 -0400 Subject: [PATCH] fix(eslint-plugin): skip seenTypes for unions in isTypeReadonly (#4043) --- packages/eslint-plugin/src/util/isTypeReadonly.ts | 6 ++++-- .../rules/prefer-readonly-parameter-types.test.ts | 12 +++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/src/util/isTypeReadonly.ts b/packages/eslint-plugin/src/util/isTypeReadonly.ts index 8b3efc27856..8231455c294 100644 --- a/packages/eslint-plugin/src/util/isTypeReadonly.ts +++ b/packages/eslint-plugin/src/util/isTypeReadonly.ts @@ -185,8 +185,10 @@ function isTypeReadonlyRecurser( if (isUnionType(type)) { // all types in the union must be readonly - const result = unionTypeParts(type).every(t => - isTypeReadonlyRecurser(checker, t, options, seenTypes), + const result = unionTypeParts(type).every( + t => + seenTypes.has(t) || + isTypeReadonlyRecurser(checker, t, options, seenTypes), ); const readonlyness = result ? Readonlyness.Readonly : Readonlyness.Mutable; return readonlyness; diff --git a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts index 0a6ee103807..be50f096963 100644 --- a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts @@ -280,13 +280,23 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, // TSMethodSignature // https://github.com/typescript-eslint/typescript-eslint/issues/1665 - // directly recursive + // directly recursive interface ` interface Foo { readonly prop: Foo; } function foo(arg: Foo) {} `, + + // https://github.com/typescript-eslint/typescript-eslint/issues/3396 + // directly recursive union type + ` + type MyType = string | readonly MyType[]; + + function foo(a: A): MyType[] { + return []; + } + `, // indirectly recursive ` interface Foo {