From 6987ecc1dacfb45c0f8ed3e81d08aa708eb96ad1 Mon Sep 17 00:00:00 2001 From: Josh Abrams Date: Sun, 10 May 2020 21:49:41 -0400 Subject: [PATCH] fix(eslint-plugin): [no-base-to-string] support boolean in unions (#1979) --- .../src/rules/no-base-to-string.ts | 21 +++++++++++++++++-- .../tests/rules/no-base-to-string.test.ts | 8 +++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-base-to-string.ts b/packages/eslint-plugin/src/rules/no-base-to-string.ts index 364d7aa0194..5a07edc11c3 100644 --- a/packages/eslint-plugin/src/rules/no-base-to-string.ts +++ b/packages/eslint-plugin/src/rules/no-base-to-string.ts @@ -123,10 +123,27 @@ export default util.createRule({ return Usefulness.Never; } + let allSubtypesUseful = true; + let someSubtypeUseful = false; + for (const subType of type.types) { - if (collectToStringCertainty(subType) !== Usefulness.Never) { - return Usefulness.Sometimes; + const subtypeUsefulness = collectToStringCertainty(subType); + + if (subtypeUsefulness !== Usefulness.Always && allSubtypesUseful) { + allSubtypesUseful = false; } + + if (subtypeUsefulness !== Usefulness.Never && !someSubtypeUseful) { + someSubtypeUseful = true; + } + } + + if (allSubtypesUseful && someSubtypeUseful) { + return Usefulness.Always; + } + + if (someSubtypeUseful) { + return Usefulness.Sometimes; } return Usefulness.Never; diff --git a/packages/eslint-plugin/tests/rules/no-base-to-string.test.ts b/packages/eslint-plugin/tests/rules/no-base-to-string.test.ts index bca40cf29dd..99d94943767 100644 --- a/packages/eslint-plugin/tests/rules/no-base-to-string.test.ts +++ b/packages/eslint-plugin/tests/rules/no-base-to-string.test.ts @@ -78,6 +78,14 @@ const literalWithToString = { toString: () => 'Hello, world!', }; '' + literalToString; + `, + ` +const printer = (inVar: string | number | boolean) => { + inVar.toString(); +}; +printer(''); +printer(1); +printer(true); `, 'let _ = {} * {};', 'let _ = {} / {};',