From fd185937f9c81c62ab7ee192c79bc819dcf24496 Mon Sep 17 00:00:00 2001 From: YeonJuan Date: Fri, 6 Dec 2024 02:56:50 +0900 Subject: [PATCH 1/4] fix(eslint-plugin): handle string like index type --- .../src/rules/no-unnecessary-condition.ts | 7 +++- .../rules/no-unnecessary-condition.test.ts | 42 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts b/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts index c4bed147eb88..e6eaf77190f6 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts @@ -751,8 +751,13 @@ export default createRule({ if (propType) { return isNullableType(propType); } + const indexInfo = checker.getIndexInfosOfType(type); - return !!checker.getIndexInfoOfType(type, ts.IndexKind.String); + return indexInfo.some( + info => + getTypeName(checker, info.keyType) === 'string' && + isNullableType(info.type), + ); }); return !isOwnNullable && isNullableType(prevType); } diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts index 7aaed5539e21..18c39d21fc46 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts @@ -982,6 +982,11 @@ isString('falafel'); `, options: [{ checkTypePredicates: true }], }, + ` +type A = { [name in Lowercase]?: A }; +declare const a: A; +a.a?.a?.a; + `, ], invalid: [ @@ -2766,5 +2771,42 @@ isString('fa' + 'lafel'); '((string & { __brandA: string }) | (number & { __brandB: string })) & ("foo" | 123)', 'alwaysTruthy', ), + { + code: ` +type A = { + [name in Lowercase]?: { + [name in Lowercase]: { + a: 1; + }; + }; +}; + +declare const a: A; + +a.a?.a?.a; + `, + errors: [ + { + column: 7, + endColumn: 9, + endLine: 12, + line: 12, + messageId: 'neverOptionalChain', + }, + ], + output: ` +type A = { + [name in Lowercase]?: { + [name in Lowercase]: { + a: 1; + }; + }; +}; + +declare const a: A; + +a.a?.a.a; + `, + }, ], }); From 70584e1baad470f1998295862b32b5c9f693608e Mon Sep 17 00:00:00 2001 From: YeonJuan Date: Fri, 6 Dec 2024 03:36:24 +0900 Subject: [PATCH 2/4] Update no-unnecessary-condition.test.ts --- .../rules/no-unnecessary-condition.test.ts | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts index 18c39d21fc46..38bf78313892 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts @@ -987,6 +987,29 @@ type A = { [name in Lowercase]?: A }; declare const a: A; a.a?.a?.a; `, + ` +interface T { + [name: Lowercase]: { + [name: Lowercase]: { + [name: Lowercase]: { + value: 'value'; + }; + }; + }; + [name: Uppercase]: null | { + [name: Uppercase]: null | { + [name: Uppercase]: null | { + VALUE: 'VALUE'; + }; + }; + }; +} + +declare const t: T; + +t.a.a.a.value; +t.A?.A?.A?.VALUE; + `, ], invalid: [ @@ -2808,5 +2831,52 @@ declare const a: A; a.a?.a.a; `, }, + { + code: ` +interface T { + [name: Lowercase]: { + [name: Lowercase]: { + [name: Lowercase]: { + vale: 'value'; + }; + }; + }; + [name: Uppercase]: null | { + [name: Uppercase]: null | { + [name: Uppercase]: null | { + VALUE: 'VALUE'; + }; + }; + }; +} + +declare const t: T; + +t.a?.a?.a?.value; + `, + errors: [ + { + column: 4, + endColumn: 6, + endLine: 21, + line: 21, + messageId: 'neverOptionalChain', + }, + { + column: 7, + endColumn: 9, + endLine: 21, + line: 21, + messageId: 'neverOptionalChain', + }, + { + column: 10, + endColumn: 12, + endLine: 21, + line: 21, + messageId: 'neverOptionalChain', + }, + ], + }, ], }); From cd592ac0d1111a043e0357cf3bce8b2026022b37 Mon Sep 17 00:00:00 2001 From: YeonJuan Date: Fri, 6 Dec 2024 03:37:58 +0900 Subject: [PATCH 3/4] Update no-unnecessary-condition.test.ts --- .../rules/no-unnecessary-condition.test.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts index 38bf78313892..bf9497dbce68 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts @@ -2877,6 +2877,28 @@ t.a?.a?.a?.value; messageId: 'neverOptionalChain', }, ], + output: ` +interface T { + [name: Lowercase]: { + [name: Lowercase]: { + [name: Lowercase]: { + vale: 'value'; + }; + }; + }; + [name: Uppercase]: null | { + [name: Uppercase]: null | { + [name: Uppercase]: null | { + VALUE: 'VALUE'; + }; + }; + }; +} + +declare const t: T; + +t.a.a.a.value; + `, }, ], }); From 4fd032f9075acf0ec648acd82dee1833045e30a0 Mon Sep 17 00:00:00 2001 From: YeonJuan Date: Sat, 7 Dec 2024 01:17:58 +0900 Subject: [PATCH 4/4] review --- .../tests/rules/no-unnecessary-condition.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts index bf9497dbce68..8c92e36dd8b0 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts @@ -2837,7 +2837,7 @@ interface T { [name: Lowercase]: { [name: Lowercase]: { [name: Lowercase]: { - vale: 'value'; + value: 'value'; }; }; }; @@ -2882,7 +2882,7 @@ interface T { [name: Lowercase]: { [name: Lowercase]: { [name: Lowercase]: { - vale: 'value'; + value: 'value'; }; }; }; pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy